dplyr包-汇总数据的方法
专题介绍:R是一种广泛用于数据分析和统计计算的强大语言,于上世纪90年代开始发展起来。得益于全世界众多 爱好者的无尽努力,大家继而开发出了一种基于R但优于R基本文本编辑器的R Studio(用户的界面体验更好)。也正是由于全世界越来越多的数据科学社区和用户对R包的慷慨贡献,让R语言在全球范围内越来越流行。其中一些R包,例如MASS,SparkR, ggplot2,使数据操作,可视化和计算功能越来越强大。R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。R作为一种统计分析软件,是集统计分析与图形显示于一体的。它可以运行于UNIX、Windows和Macintosh的操作系统上,而且嵌入了一个非常方便实用的帮助系统,相比于其他统计分析软件,R的学术性开发比较早,适合生物学和医学等学术学科的科研人员使用。
【R语言】已开通R语言社群,五湖四海,天南地北,各行各业,有缘相聚,共享R事,雕刻数据,求解问题,以创价值。喜乐入群者,请加微信号luqin360,或扫描文末二维码,添加为好友,同时附上R-入群。有朋自远方来,不亦乐乎,并诚邀入群,以达相互学习和进步之美好心愿。
这是dplyr包系列第四篇文章。前三篇文章如下:
前三篇文章,我们已经从数据的行与列角度,总结了dplyr包有效而高效地进行行与列的操作和处理,灵活使用dplyr包的函数集,便利我们对数据的整理工作。本文介绍dplyr包做数据汇总的方法。数据汇总有很多应用场景,例如我们熟知而常用的分组统计,即采用分组的思维+聚合的运算;数据的描述性统计与分析等。本文的数据汇总,主要介绍以下内容:1统计变量取值的分布,可以观察单一变量或者多个变量的取值分布情况(列联表的效果);2计算观察数,汇总数据集的行数,宏观感知样本的大小;3数据聚合运算和4数据分组聚合运算,有时候需要通过整体聚合或者分组聚合来观察和理解数据;5所有变量数据聚合运算、6基于条件选择变量的聚合运算和7指定变量的聚合运算,基于条件式的对满足条件的变量做聚合操作,条件的方式包括全满足、条件式满足或者指定性满足;8针对聚合运算的结果做有序操作,对聚合后的结果做有序处理,更便利解读数据;9Top-k的操作,从聚合后的结果里面摘选TopK的数据。
和前面的文章一样,我们还是采用R自带的数据集msleep。这个数据集来自于ggplot2包,可以通过ggplot2::msleep的方式加载数据集。这个数据集是关于哺乳动物的睡眠数据集,它包括83行和11个变量。它可以帮助研究者定量理解哺乳动物睡眠情况。这个数据集的详细介绍以及关于每个变量对应的含义,可以通过R语言的帮助文档查看,使用help(ggplot2::msleep)或者?ggplot2::msleep的方式打开帮助文档。部分结果如下图所示:
第一步:加载R包和数据集
1# 第一步:加载R包和数据集
2library(pacman)
3p_load(dplyr)
4msleep <- ggplot2::msleep
5msleep %>% glimpse
第二步:数据汇总操作示范
1 统计变量取值的分布
统计数据集某一个特定变量的取值分布情况,使用count()函数,参数sort=True表示降序操作
1msleep %>%
2 count(order, sort = TRUE)
当count()函数使用多个变量的时候,可以实现列联表的功能。
2 计算观察数
计算观察数,可以使用tally()函数,若是需要这个结果添加为一列,可以使用add_tally()函数
1msleep %>%
2 tally
3
4msleep %>%
5 select(1:3) %>%
6 add_tally %>%
7 head
思考题:若是需要把某一个变量的取值分布结果添加到数据集,如何实现?可以采用add_count()函数
3 数据聚合运算
聚合运算使用summarise()函数,可作用于各种聚合函数,例如均值函数,最小值函数,最大值函数等。
1msleep %>%
2 summarise(n = n()
3 , average = mean(sleep_total)
4 , maximum = max(sleep_total))
4 数据分组聚合运算
使用group_by()函数与summarise()函数综合处理。
1msleep %>%
2 group_by(vore) %>%
3 summarise(n = n()
4 , average = mean(sleep_total)
5 , maximum = max(sleep_total))
思考题:请总结常用的聚合函数?例如n()函数,n_distinct()函数,sum()函数,min()函数,max()函数,mean()函数,median()函数,sd()函数和IQR()函数等。这些函数分别表示什么作用?
若是需要把某一个变量的取值分布结果添加到数据集,如何实现?可以采用add_count()函数
5 所有变量数据聚合运算
使用summarise_all()函数实现基于所有变量的聚合运算。
1msleep %>%
2 group_by(vore) %>%
3 summarise_all(~mean(., na.rm = TRUE) + 5)
6 基于条件选择变量的聚合运算
使用summarise_if()函数做基于条件选择满足要求的变量参与聚合运算,常用的条件判断函数有:
is.numeric,is.integer,is.double,is.logical,is.factor,lubridate::is.POSIXt或者lubridate::is.Date
1msleep %>%
2 group_by(vore) %>%
3 summarise_if(is.numeric, mean, na.rm=TRUE) %>%
4 head
思考题:请问下面这个代码片段实现什么功能?
1msleep %>%
2 group_by(vore) %>%
3 summarise_if(is.numeric, mean, na.rm=TRUE) %>%
4 rename_if(is.numeric, ~paste0("avg_", .))
7指定变量的聚合运算
使用summarise_at()函数实现指定变量聚合运算,需要vars()来帮助选择指定的变量。
1msleep %>%
2 group_by(vore) %>%
3 summarise_at(vars(contains("sleep")), mean, na.rm=TRUE) %>%
4 rename_at(vars(contains("sleep")), ~paste0("avg_", .))
8针对聚合运算的结果做有序操作
针对聚合运算的结果做有序操作,这是数据分析经常需要使用,方便我们更好地解读数据。使用arrange()函数,默认是升序,借助desc()函数帮忙,以实现降序。
1msleep %>%
2 group_by(vore) %>%
3 summarise(avg_sleep = mean(sleep_total)) %>%
4 arrange(desc(avg_sleep))
若是需要在每个组里面做排序,把arrange()函数的参数.by_group设置为TRUE就好。
思考题:请问下面这个代码片段实现什么功能?
1msleep %>%
2 select(order, name, sleep_total) %>%
3 group_by(order) %>%
4 arrange(desc(sleep_total), .by_group = TRUE)
9 Topk的操作
针对聚合运算的结果做Topk操作,可以使用top_n()函数,例如:选择前6个最小值或者最大值。
1msleep %>%
2 group_by(order) %>%
3 summarise(average = mean(sleep_total)) %>%
4 top_n(5)
5
6msleep %>%
7 group_by(order) %>%
8 summarise(average = mean(sleep_total)) %>%
9 top_n(-5)
10
11msleep %>%
12 group_by(order) %>%
13 summarise(average_sleep = mean(sleep_total), max_sleep = max(sleep_total)) %>%
14 top_n(5, average_sleep)
补充:在介绍行选择的时候,我们还可以对行做随机选择。比方说,我们建模的时候,要对样本做随机划分,可以使用sample_n()函数或者sample_frac()函数。我们也可以使用slice()函数,对行按着我们指定的位置做切片操作。
1msleep %>%
2 sample_n(10)
3
4msleep %>%
5 sample_frac(.2)
6
7msleep %>%
8 slice(10:40)
总结:
dplyr包是一个强大数据整理包,提供丰富地函数,可以对数据的行与列,数据的汇总做方便而有效地加工。大家在后续使用实际数据的过程中,肯定要对数据做整理,可以使用dplyr包来帮助完成好这个工作。
思考题的答案可以留言或者加入R语言群交流和和讨论。
完整代码:
1###########
2#dplyr包-汇总数据
3##########
4
5# 第一步:加载R包和数据集
6library(pacman)
7p_load(dplyr)
8msleep <- ggplot2::msleep
9msleep %>% glimpse
10
11# 第二步:数据汇总示范
12# 1 统计变量取值的分布
13msleep %>%
14 count(order, sort = TRUE)
15
16msleep %>%
17 count(order, vore, sort = TRUE)
18
19# 2 计算观察数
20msleep %>%
21 tally
22
23msleep %>%
24 select(1:3) %>%
25 add_tally %>%
26 head
27
28msleep %>%
29 select(name:vore) %>%
30 add_count(vore) %>%
31 head
32
33# 3 数据聚合运算
34msleep %>%
35 summarise(n = n()
36 , average = mean(sleep_total)
37 , maximum = max(sleep_total))
38
39# 4 数据分组聚合运算
40msleep %>%
41 group_by(vore) %>%
42 summarise(n = n()
43 , average = mean(sleep_total)
44 , maximum = max(sleep_total))
45
46# 5 所有变量的聚合运算
47msleep %>%
48 group_by(vore) %>%
49 summarise_all(~mean(., na.rm = TRUE) + 5) %>%
50 head
51
52# 6 基于条件选择的变量的聚合运算
53msleep %>%
54 group_by(vore) %>%
55 summarise_if(is.numeric, mean, na.rm=TRUE) %>%
56 head
57
58msleep %>%
59 group_by(vore) %>%
60 summarise_if(is.numeric, mean, na.rm=TRUE) %>%
61 rename_if(is.numeric, ~paste0("avg_", .))
62
63# 7 基于指定变量的聚合运算
64msleep %>%
65 group_by(vore) %>%
66 summarise_at(vars(contains("sleep")), mean, na.rm=TRUE) %>%
67 rename_at(vars(contains("sleep")), ~paste0("avg_", .))
68
69# 8 针对聚合运算做有序操作
70msleep %>%
71 group_by(vore) %>%
72 summarise(avg_sleep = mean(sleep_total)) %>%
73 arrange(desc(avg_sleep))
74
75msleep %>%
76 select(order, name, sleep_total) %>%
77 group_by(order) %>%
78 arrange(desc(sleep_total), .by_group = TRUE)
79
80# 9 TopK操作
81msleep %>%
82 group_by(order) %>%
83 summarise(average = mean(sleep_total)) %>%
84 top_n(5)
85
86msleep %>%
87 group_by(order) %>%
88 summarise(average = mean(sleep_total)) %>%
89 top_n(-5)
90
91msleep %>%
92 group_by(order) %>%
93 summarise(average_sleep = mean(sleep_total), max_sleep = max(sleep_total)) %>%
94 top_n(5, average_sleep)
95
96
97# 补充行的随机选择
98msleep %>%
99 sample_n(10)
100
101msleep %>%
102 sample_frac(.2)
103
104msleep %>%
105 slice(10:40)
参考资料:
1https://suzan.rbind.io/2018/04/dplyr-tutorial-4/
你在阅读中,遇到什么问题,或者有什么心得与收获,可以扫描我的微信号,备注“R-入群”。我会邀请你加入R语言群,和大家一起讨论与学习。
R书籍推荐
4 数据挖掘与R语言
公众号推荐
数据科学与人工智能
数据科学与人工智能公众号推广Python语言,数据科学与人工智能的知识和信息。扫码下方二维码关注我,一起学习Python语言和数据科学与人工智能。
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!