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包系列第三篇文章。前两篇文章如下:
前两篇文章是从数据列的角度做选择和变换处理。这篇文章是从数据行的角度,描写行选择的一系列操作与方法。数据的行,可以看作为观察、样例、对象等。
数据的行选择,主要包括如下内容:
1 基于比较运算的行选择
2 基于字符匹配的行选择
3 基于正则模式的行选择
4 基于多条件的行选择
5 跨越多列的行选择
我们以R自带数据,采用管道的操作,演示行选择的具体操作和实现。
第一步:加载R包和自带数据集
1# 第一步:R包和自带数据集
2library(pacman)
3p_load(tidyverse)
4# 使用msleep数据集
5msleep %>% glimpse
6msleep %>% head
第二步:行选择操作实例
行选择,灵活使用filter()函数
1 基于比较运算的行选择
适合于数值型变量,使用>,<,>=,<=,==或者!=比较关系运算符号
1# 1 比较运算的行选择
2msleep %>%
3 select(name, sleep_total) %>%
4 filter(sleep_total > 12) %>%
5 head
6
7msleep %>%
8 select(name, sleep_total) %>%
9 filter(between(sleep_total, 12, 18)) %>%
10 head
between()函数用来确定一个闭区间。
思考题:请问下面这个代码片段实现什么功能?
1msleep %>%
2 select(name, sleep_total) %>%
3 filter(near(sleep_total, 17, tol = sd(sleep_total))) %>%
4 head
2 基于字符匹配的行选择
使用比较运算符号或者%in%运算或者布尔逻辑关系,构建满足要求的过滤逻辑。
1msleep %>%
2 select(order, name, sleep_total) %>%
3 filter(order == "Didelphimorphia") %>%
4 head
5
6msleep %>%
7 select(order, name, sleep_total) %>%
8 filter(order %in% c("Didelphimorphia", "Diprotodontia")) %>%
9 head
10
11remove <- c("Rodentia", "Carnivora", "Primates")
12msleep %>%
13 select(order, name, sleep_total) %>%
14 filter(!order %in% remove) %>%
15 head
3 基于正则模式的行选择
使用grepl()函数或者stringr包的str_detect()函数,利用正则模式,设计和构建满足要求的行选择逻辑。
1msleep %>%
2 select(name, sleep_total) %>%
3 filter(str_detect(tolower(name), pattern = "mouse")) %>%
4 head
4 基于多条件的行选择
通过多条件关系和布尔逻辑关系,构建满足需求和更复杂的行选择逻辑。
1msleep %>%
2 select(name, order, sleep_total:bodywt) %>%
3 filter(bodywt > 100, (sleep_total > 15 | order != "Carnivora")) %>%
4 head
5
6msleep %>%
7 select(name, sleep_total, brainwt, bodywt) %>%
8 filter(brainwt > 1, !bodywt > 100)
5 跨越多列的行选择
根据列的逻辑选择满足某种模式的行,会用到filter_all()函数,filter_if()函数,filter_at()函数。
1)filter_all()函数
选择所有列或者任意列满足某种逻辑的行选择
1# 1)filter_all()
2msleep %>%
3 select(name:order, sleep_total, -vore) %>%
4 filter_all(any_vars(str_detect(., pattern = "Ca"))) %>%
5 head
6
7msleep %>%
8 select(name, sleep_total:bodywt) %>%
9 filter_all(any_vars(. < 0.1)) %>%
10 head
11
12msleep %>%
13 select(name, sleep_total:bodywt, -awake) %>%
14 filter_all(all_vars(. > 1)) %>%
15 head
2)filter_if()函数
首先,选择if条件为真的列,然后针对这些列类似filter_all()的操作
1# 2) filter_if()
2msleep %>%
3 select(name:order, sleep_total:sleep_rem) %>%
4 filter_if(is.character, any_vars(is.na(.))) %>%
5 head
3)filter_at()函数
与filter_if()函数对比发现,通过人为指定为真的列,然后针对这些列类似filter_all()的操作
1msleep %>%
2 select(name, sleep_total:sleep_rem, brainwt:bodywt) %>%
3 filter_at(vars(sleep_total, sleep_rem), all_vars(.>5)) %>%
4 head
5
6msleep %>%
7 select(name, sleep_total:sleep_rem, brainwt:bodywt) %>%
8 filter_at(vars(contains("sleep")), all_vars(.>5)) %>%
9 head
总结:行选择,就是基于需求,设计和构建行选择逻辑,使用filter()函数或者filter函数变体,以实现行选择的目的。
完整代码:
1################
2#dplyr包行选择的方法
3###############
4
5# 第一步:R包和自带数据集
6library(pacman)
7p_load(tidyverse)
8# 使用msleep数据集
9msleep %>% glimpse
10msleep %>% head
11
12# 第二步:行选择
13# 1 比较运算的行选择
14msleep %>%
15 select(name, sleep_total) %>%
16 filter(sleep_total > 12) %>%
17 head
18
19msleep %>%
20 select(name, sleep_total) %>%
21 filter(between(sleep_total, 12, 18)) %>%
22 head
23
24msleep %>%
25 select(name, sleep_total) %>%
26 filter(near(sleep_total, 17, tol = sd(sleep_total))) %>%
27 head
28
29# 字符匹配的行选择
30msleep %>%
31 select(order, name, sleep_total) %>%
32 filter(order == "Didelphimorphia") %>%
33 head
34
35msleep %>%
36 select(order, name, sleep_total) %>%
37 filter(order %in% c("Didelphimorphia", "Diprotodontia")) %>%
38 head
39
40remove <- c("Rodentia", "Carnivora", "Primates")
41msleep %>%
42 select(order, name, sleep_total) %>%
43 filter(!order %in% remove) %>%
44 head
45
46# 3 基于正则模式的行选择
47msleep %>%
48 select(name, sleep_total) %>%
49 filter(str_detect(tolower(name), pattern = "mouse")) %>%
50 head
51
52# 4 基于多条件的行选择
53msleep %>%
54 select(name, order, sleep_total:bodywt) %>%
55 filter(bodywt > 100, (sleep_total > 15 | order != "Carnivora")) %>%
56 head
57
58msleep %>%
59 select(name, sleep_total, brainwt, bodywt) %>%
60 filter(brainwt > 1, !bodywt > 100) %>%
61 head
62
63# 跨越多列的行选择
64# 1)filter_all()
65msleep %>%
66 select(name:order, sleep_total, -vore) %>%
67 filter_all(any_vars(str_detect(., pattern = "Ca"))) %>%
68 head
69
70msleep %>%
71 select(name, sleep_total:bodywt) %>%
72 filter_all(any_vars(. < 0.1)) %>%
73 head
74
75msleep %>%
76 select(name, sleep_total:bodywt, -awake) %>%
77 filter_all(all_vars(. > 1)) %>%
78 head
79
80# 2) filter_if()
81msleep %>%
82 select(name:order, sleep_total:sleep_rem) %>%
83 filter_if(is.character, any_vars(is.na(.))) %>%
84 head
85
86
87
88# 3) filter_at()
89msleep %>%
90 select(name, sleep_total:sleep_rem, brainwt:bodywt) %>%
91 filter_at(vars(sleep_total, sleep_rem), all_vars(.>5)) %>%
92 head
93
94msleep %>%
95 select(name, sleep_total:sleep_rem, brainwt:bodywt) %>%
96 filter_at(vars(contains("sleep")), all_vars(.>5)) %>%
97 head
参考资料:
1https://suzan.rbind.io/2018/02/dplyr-tutorial-3/
你在阅读中,遇到什么问题,或者有什么心得与收获,可以扫描我的微信号,备注“R-入群”。我会邀请你加入R语言群,和大家一起讨论与学习。
推荐阅读:
推荐公众号:数据科学与人工智能
数据科学与人工智能公众号推广Python语言,数据科学与人工智能的知识和信息。扫码下方二维码关注我,一起学习Python语言和数据科学与人工智能。
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!