首页 > 科研教程 > dplyr包-行选择的方法
2022
07-08

dplyr包-行选择的方法

《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/



最后编辑:
作者:萌小白
一个热爱网络的青年!

发布评论

表情