dplyr包-行选择的方法
卖萌控的博客
点击这里进入电脑版页面!体验更好
dplyr包-行选择的方法
2022-7-8 萌小白


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



发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容