《R包学习》专栏·第3篇
文| R学习者
2352字 | 6分钟阅读
这是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%>%
3select(name, sleep_total) %>%
4filter(sleep_total > 12) %>%
5head
6
7msleep %>%
8select(name, sleep_total) %>%
9filter(between(sleep_total, 12, 18)) %>%
10head
between函数用来确定一个闭区间。
思考题:请问下面这个代码片段实现什么功能?
1msleep%>%
2select(name, sleep_total) %>%
3filter(near(sleep_total, 17, tol = sd(sleep_total))) %>%
4head
2 基于字符匹配的行选择
使用比较运算符号或者%in%运算或者布尔逻辑关系,构建满足要求的过滤逻辑。
1msleep %>%
2select( order, name, sleep_total) %>%
3filter( order== "Didelphimorphia") %>%
4head
5
6msleep %>%
7select( order, name, sleep_total) %>%
8filter( order% in% c( "Didelphimorphia", "Diprotodontia")) %>%
9head
10
11remove <- c( "Rodentia", "Carnivora", "Primates")
12msleep %>%
13select( order, name, sleep_total) %>%
14filter(! order% in% remove) %>%
15head
3 基于正则模式的行选择
使用 grepl函数或者 stringr包的str_detect函数,利用正则模式,设计和构建满足要求的行选择逻辑。
1msleep%>%
2select(name, sleep_total) %>%
3filter(str_detect(tolower(name), pattern = "mouse")) %>%
4head
4 基于多条件的行选择
通过多条件关系和布尔逻辑关系,构建满足需求和更复杂的行选择逻辑。
1msleep %>%
2select(name, order, sleep_total:bodywt) %>%
3filter(bodywt > 100, (sleep_total > 15| order!= "Carnivora")) %>%
4head
5
6msleep %>%
7select(name, sleep_total, brainwt, bodywt) %>%
8filter(brainwt > 1, !bodywt > 100)
5 跨越多列的行选择
根据列的逻辑选择满足某种模式的行,会用到filter_all函数,filter_if函数,filter_at函数。
1)filter_all函数
选择所有列或者任意列满足某种逻辑的行选择
1# 1)filter_all
2msleep%>%
3select(name:order, sleep_total, -vore) %>%
4filter_all(any_vars(str_detect(., pattern = "Ca"))) %>%
5head
6
7msleep %>%
8select(name, sleep_total:bodywt) %>%
9filter_all(any_vars(. < 0. 1)) %>%
10head
11
12msleep %>%
13select(name, sleep_total:bodywt, -awake) %>%
14filter_all(all_vars(. > 1)) %>%
15head
2)filter_if函数
首先,选择if条件为真的列,然后针对这些列类似filter_all的操作
1# 2) filter_if
2msleep %>%
3select(name: order, sleep_total:sleep_rem) %>%
4filter_if( is.character, any_vars( is.na(.))) %>%
5head
3)filter_at函数
与filter_if函数对比发现,通过人为指定为真的列, 然后针对这些列类似filter_all()的操作
1msleep%>%
2select( name, sleep_total:sleep_rem, brainwt:bodywt)%>%
3filter_at( vars( sleep_total, sleep_rem), all_vars(.>5)) %>%
4head
5
6msleep%>%
7select( name, sleep_total:sleep_rem, brainwt:bodywt)%>%
8filter_at( vars( contains(" sleep")), all_vars(.>5)) %>%
9head
总结:行选择,就是基于需求,设计和构建行选择逻辑,使用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 %>%
15select(name, sleep_total) %>%
16filter(sleep_total > 12) %>%
17head
18
19msleep %>%
20select(name, sleep_total) %>%
21filter(between(sleep_total, 12, 18)) %>%
22head
23
24msleep %>%
25select(name, sleep_total) %>%
26filter(near(sleep_total, 17, tol = sd(sleep_total))) %>%
27head
28
29# 字符匹配的行选择
30msleep %>%
31select( order, name, sleep_total) %>%
32filter( order== "Didelphimorphia") %>%
33head
34
35msleep %>%
36select( order, name, sleep_total) %>%
37filter( order% in% c( "Didelphimorphia", "Diprotodontia")) %>%
38head
39
40remove <- c( "Rodentia", "Carnivora", "Primates")
41msleep %>%
42select( order, name, sleep_total) %>%
43filter(! order% in% remove) %>%
44head
45
46# 3 基于正则模式的行选择
47msleep %>%
48select(name, sleep_total) %>%
49filter(str_detect(tolower(name), pattern = "mouse")) %>%
50head
51
52# 4 基于多条件的行选择
53msleep %>%
54select(name, order, sleep_total:bodywt) %>%
55filter(bodywt > 100, (sleep_total > 15| order!= "Carnivora")) %>%
56head
57
58msleep %>%
59select(name, sleep_total, brainwt, bodywt) %>%
60filter(brainwt > 1, !bodywt > 100) %>%
61head
62
63# 跨越多列的行选择
64# 1)filter_all
65msleep %>%
66select(name: order, sleep_total, -vore) %>%
67filter_all(any_vars(str_detect(., pattern = "Ca"))) %>%
68head
69
70msleep %>%
71select(name, sleep_total:bodywt) %>%
72filter_all(any_vars(. < 0.1)) %>%
73head
74
75msleep %>%
76select(name, sleep_total:bodywt, -awake) %>%
77filter_all(all_vars(. > 1)) %>%
78head
79
80# 2) filter_if
81msleep %>%
82select(name: order, sleep_total:sleep_rem) %>%
83filter_if( is.character, any_vars( is.na(.))) %>%
84head
85
86
87
88# 3) filter_at
89msleep %>%
90select(name, sleep_total:sleep_rem, brainwt:bodywt) %>%
91filter_at(vars(sleep_total, sleep_rem), all_vars(.> 5)) %>%
92head
93
94msleep %>%
95select(name, sleep_total:sleep_rem, brainwt:bodywt) %>%
96filter_at(vars(contains( "sleep")), all_vars(.> 5)) %>%
97head
参考资料:
1https://suzan.rbind.io/2018/02/dplyr-tutorial-3/
- 本文固定链接: https://maimengkong.com/kyjc/1104.html
- 转载请注明: : 萌小白 2022年7月8日 于 卖萌控的博客 发表
- 百度已收录