首发于 R语言
【越学越厉害】R语言编程必备,tidyverse最实用的开源包推荐!

【越学越厉害】R语言编程必备,tidyverse最实用的开源包推荐!

R语言是数据科学家和统计学家的选择之一。对于数据分析和数据可视化,R语言拥有丰富的开源包提供支持。其中最受欢迎的R包之一是tidyverse。Tidyverse是Hadley Wickham设计的一组R包,它们一起工作,采用一致的规范和语法。本文将介绍一些tidyverse中最实用的开源包,以及它们的功能。

1、首先是ggplot2

让您快速获得数据可视化的绝佳体验,非ggplot2莫属!这种艺术般的工具,将数据的排列、美观和易读性完美融合,让你的数据变得生动起来。她的万能图层语法,让它在图形处理中毫不费力的创建出令人惊叹的作品。这正是其高超可读性的原因——无论您是业务分析,学术出版,还是统计建模,ggplot2都能让您轻松掌握亲手打造出高清晰度的漂亮图表的技巧,让您的研究更具影响力!以下是一个简单的例子:

我们采用的数据集是`iris`,该数据集包含了150朵鸢尾花的测量数据,其中包括花瓣长度、花瓣宽度、花萼长度、花萼宽度以及所属鸢尾花的种类。这里我们用ggplot2绘制散点图,其中横坐标为花萼长度,纵坐标为花瓣长度,颜色根据花的种类进行分类。

下面是数据集的前6个观测值示例:

Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5 3.6 1.4 0.2 setosa
5.4 3.9 1.7 0.4 setosa

代码如下:

library(ggplot2)
data(iris)
ggplot(data = iris, aes(x = Sepal.Length, y = Petal.Length, color = Species)) +
geom_point(size = 2) +
labs(title = "Iris Sepal and Petal Length", x = "Sepal Length", y = "Petal Length", color = "Species")

以下是代码绘制的散点图,其中不同颜色代表的是不同的鸢尾花种类:

2、接下来是dplyr。

当涉及到数据操纵时,您需要dplyr!这是一款高效流畅的工具,可满足您所有的数据处理需求:无论是数据的筛选、排序,还是快速汇总和过滤,dplyr都能帮助您轻松应对。最令人惊叹的是,它终于能够以清新脱俗的方式书写,让你拥有一种流畅且愉悦的使用体验,就仿佛一个技能娴熟的舞者在跳尽其所能,周而复始且增添新意。dplyr不仅易于使用,而且处理数据速度奇快,毫不磨蹭就能完成重复的工作——它将在日常数据处理中为您释放更多时间和精力,让您把更多的注意力投入到创造性、战略型活动中。规模化处理大数据时,dplyr将是您的得力助手,爬山越岭皆可轻松驾驭,是您提升数据检索技能,为学术和商业工作增添色彩的首选利器!以下是一个简单的例子:

在这里我们使用dplyr来对航班延误数据进行操作。

# 加载dplyr包library(dplyr)
# 加载flights数据集data("flights")
# 显示数据结构及部分示例数据str(flights)
head(flights)
# 按照目的地分组,计算每个目的地的总延迟时间top_flights <- flights %>%
group_by(dest) %>%
summarize(total_delay = sum(arr_delay)) %>%
arrange(desc(total_delay)) %>%
head(10)
# 显示结果top_flights

数据介绍:航班延误数据集(flights)是一个包含了来自于美国连续的11个月的航班信息的数据集。数据集包含了实际起飞日期和时间,航班号,起飞机场和目的地机场,航空公司信息等等。其中arr_delay表示到达该目的地的延迟时间。

部分示例数据如下所示:

year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance hour minute
2013 1 1 517 515 2 830 819 11 UA 1545 N14228 EWR IAH 227 1400 5 15
2013 1 1 533 529 4 850 830 20 UA 1714 N24211 LGA IAH 227 1416 5 29
2013 1 1 542 540 2 923 850 33 AA 1141 N619AA JFK MIA 160 1089 5 40
2013 1 1 544 545 -1 1004 1022 -18 B6 725 N804JB JFK BQN 183 1576 5 45
2013 1 1 554 600 -6 812 837 -25 DL 461 N668DN LGA ATL 116 762 6 0
2013 1 1 554 558 -4 740 728 12 UA 1696 N39463 EWR ORD 150 719 5 58

使用dplyr可以对数据进行简单且快速的操作,例如上述代码就是对所有航班数据按照目的地分组,计算其延误时间并按照降序排序,最终选出前10个目的地的操作

3、接下来是tidyr。

假设您有一堆混乱的数据表格需要清洗,那么让tidyr成为您的救世主吧!它是一位数据整理的明星工具,尤其在不同类型数据的转换方面大有可为。其实,我们在数据清理的过程中都会遇到一些难以预料的问题,比如一些数量错位,一些混杂的值和格式差异。在这方面,tidyr使得数据转换更简单,提供了一些实用的函数,可以将数据从一种形式转化为另一种形式。通过这些功能,您可以轻松地将“宽格式”转化为“长格式”,或将“乱码”数据转换为更规范的数据格式,让您的数据得到统一,使用起来更加高效。其次,tidyr能够协助你更精确的分析数据,让数据呈现更高的质量和精度。所以,无论您是数据分析师还是数据科学家,tidyr都是您清晰、整齐和尽可能准确的数据前置处理策略中的不二之选!以下是一个简单的例子:

library(tidyr)
library(dplyr)
# 创建包含学生姓名和两门成绩的数据框df <- data.frame(
name = c("Alice", "Bob", "Charlie"),
grade_1 = c(80, 90, 95),
grade_2 = c(85, 88, 92)
# 使用gather函数将宽格式的成绩信息转换为长格式df_long <- df %>%
gather(grade, grade_value, grade_1:grade_2)
# 展示转换后的数据框df_long %>%
knitr::kable()


转换后的数据如下所示:

name grade grade_value
Alice grade_1 80
Bob grade_1 90
Charlie grade_1 95
Alice grade_2 85
Bob grade_2 88
Charlie grade_2 92

这段代码将原始数据从“宽格式”转换为了“长格式”,通过gather函数将原本的2列成绩转换为了一列“grade”和一列“grade_value”。tidyr还有其他强大的函数,如separate、unite等等。

4、接下来,大家翘首以盼的readr来啦!

readr可以被称作是数据读取中的“神器”,它为大家提供了一个快速而准确的数据读取器,可以轻松读取多种不同类型的数据文件,比如CSV、TXT和XLSX等。读取数据极为重要,因为一旦数据格式出现错误,就会影响后续分析和处理,所带来的麻烦就只有您自己能体会了!那么,想象一下这种情形,因为数据读取器工具不够准确,导致数据遗漏或混乱。再次进行分析就会发现一些不合理的现象,浪费了很多时间和精力。但是,借助readr这个工具,您将会在最短的时间内快速而准确地读取数据,并得到您实际想要的结果。它让您不必为文件夹、文件、数据类型和文件格式等琐碎问题烦恼,只需在短暂的时间里,轻轻松松地得到数据,尽情享受数据分析的乐趣吧!

以下是一个简单的例子:

library(readr)
data <- read_csv("path_to_csv_file")

这段代码将CSV文件读取到R中,并将其存储在名为“data”的变量中。readr还提供了其他有用的函数,如write_csv、parse_number等等。

5、最后是purrr!

purrr这个包不简单,它提供了一系列高级的函数,能够轻松简化许多常见的编程任务,如迭代、映射以及过滤等等。它是数据分析师最好的朋友,因为它为您的好朋友(数据集)提供了无与伦比的处理能力!想象一下这种情景,您需要对大量数据进行筛选,筛选出精确的数据集合,这时您需要用到purrr里面的“过滤函数”;或者,您需要对几个数据集进行比较,这时您可以尝试使用映射函数。这只是其众多函数的冰山一角,purrr能够轻松处理面对的任何灵活性与复杂性数据,并简化数据分析的过程。通过这些高级函数,您可以更容易地探索和分析数据,而且还能够找出数据集合的应用和使用它们的方法。这样,您的项目将会变得更为简单和高效,假如还没有使用purrr,那么赶紧行动起来吧,体验这个包带来的强大威力! 以下是一个简单的例子:

好的,我来介绍三个使用purrr包的R语言代码案例,它们分别是对数据进行拟合、切分和统计汇总。以下是具体的介绍和代码:

案例一:对数据进行线性拟合

在这个案例中,我们将使用purrr包中的map函数,对mtcars数据集中的每一列应用线性回归模型,获取系数和截距:

library(purrr)
library(dplyr)
# 加载数据
data(mtcars)
# 使用map函数进行线性拟合,输出每一列的系数和截距
mtcars %>%
map(~ lm(.x ~ wt, data = mtcars) %>%
summary() %>%
coef() %>%
`[`("wt",) %>%
t()) %>%
enframe(name = "var", value = "coefficients") %>%
unnest() %>%
mutate_at(vars(2:3), round, digits = 3)


在上面的代码块中,我们通过管道符连接了map()和其他函数,将回归系数和截距提取出来。最后,我们将数据集转换为宽格式,并将系数和截距四舍五入至小数点后3位。输出结果如下:

# A tibble: 2 x 3
var   coefficients    x
1 mpg -5.33  37.3
2 cyl -2.88  37.9


案例二:对数据进行切分

在这个案例中,我们将使用purrr包中的map()函数,将数据集中的各个组切分,并对每个组应用函数:

library(purrr)
library(dplyr)
# 加载数据
data(mtcars)
# 将数据集按不同的车型切分
groups <- mtcars %>%
group_split(carb)
# 对切分后的各组数据进行描述性统计
maps <- map(groups, ~ summary(.x) %>%
as_tibble() %>%
mutate(group = unique(.x$carb)))
# 将各组统计结果合并
result <- bind_rows(maps)
result


在这个案例中,我们使用`group_split()`函数将数据集按照不同的`carb`值进行切分,并使用map()函数对每个组应用`summary()`函数来计算描述性统计信息。最后,我们将统计结果合并为一个数据集,其中每一行对应一个组。输出结果如下:

# A tibble: 10 x 12
mpg  cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb group
1  29.1     4  78.7    NA  4.08 1.613 18.61     1     1     4     1     1
2  22.8     4 108.     93  3.85 2.32  18.61     1     1     4     1     1
3  19.7     6 145     175  3.62 2.77  15.5      0     1     5     2     2
4  15.2     8 304     150  3.15 3.44  17.3      0     0     3     2     2
5  19.2     8 400.    175  3.08 3.84  17.0      0     0     3     2     2
6  14.7     8 440     230  3.23 5.34  17.4      0     0     3     4     4
7  10.4     8 472     205  2.93 5.25  18.0      0     0     3     4     4
8  14.3     8 360.    245  3.21 3.57  15.8      0     0     3     4     4
9  13.3     8 350     245  3.73 3.84  15.4      0     0     3     4     4
10 15.8     8 351     264  4.22 3.17  14.5      0     1     5     4     4


案例三:对列表进行统计汇总

在这个案例中,我们将使用purrr包中的map()函数,将一个列表转换为数据框,并根据一列数据进行统计汇总:

library(purrr)
library(tibble)
# 创建列表
my_list <- list(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9))
# 将列表转换为数据框
my_df <- map_df(my_list, ~ data.frame(values = .x, group = names(my_list)),
.id = "id")
# 根据id和group进行汇总