专栏首页生信补给站盘一盘Tidyverse| 只要你要只要我有-filter 筛选行

盘一盘Tidyverse| 只要你要只要我有-filter 筛选行

一 载入R包,数据

#载入R包
#install.packages("tidyverse")
library("tidyverse")
#查看内置数据集
head(msleep,2)
dim(msleep)
#[1] 83 11

本示例数据集很小,实际中数据量很大,可以根据使用filter()函数筛选出后续需要的“行”子集。

二 基于数值变量筛选

基于数值,根据 >, >=, <, <=, ==!=完成筛选

1 筛选sleep_total 大于 18

msleep %>% select(name, sleep_total) %>% 
  filter(sleep_total > 18) %>% head(2)
# A tibble: 2 x 2
  name                 sleep_total
  <chr>                      <dbl>
1 Big brown bat               19.7
2 Thick-tailed opposum        19.4

2 筛选sleep_total在16和18之间

可以filter(sleep_total >= 16, sleep_total <= 18),也可以使用between函数

msleep %>% select(name, sleep_total) %>% 
  filter(between(sleep_total, 16, 18)) %>% head(2)
# A tibble: 2 x 2
  name                 sleep_total
  <chr>                      <dbl>
1 Owl monkey                  17  
2 Long-nosed armadillo        17.4

3 筛选 均值+-3sd 范围内

near()选择”中心值“,tol()设定范围,可以是值,可以是函数

msleep %>% select(name, sleep_total) %>% 
  filter(near(sleep_total, mean(sleep_total), tol = 3*sd(sleep_total))) %>% head(2)
# A tibble: 83 x 2
   name                       sleep_total
   <chr>                            <dbl>
 1 Cheetah                           12.1
 2 Owl monkey                        17  

三 基于变量名字筛选

上面主要是根据数值,此处主要根据字符串进行筛选

1 单个变量筛选

msleep %>% select(order, name, sleep_total) %>% 
  filter(order == "Didelphimorphia")
## # A tibble: 2 x 3
##   order           name                   sleep_total
##   <chr>           <chr>                        <dbl>
## 1 Didelphimorphia North American Opossum        18.0
## 2 Didelphimorphia Thick-tailed opposum          19.4

不等于方式:filter(order != "Rodentia")

2 多个变量筛选

%in%实现多个变量选择

msleep %>% select(order, name, sleep_total) %>% 
  filter(order %in% c("Didelphimorphia", "Diprotodontia"))
# A tibble: 4 x 3
  order           name                   sleep_total
  <chr>           <chr>                        <dbl>
1 Didelphimorphia North American Opossum        18  
2 Didelphimorphia Thick-tailed opposum          19.4
3 Diprotodontia   Phalanger                     13.7
4 Diprotodontia   Potoroo                       11.1

注意区分,此处 !%in%无作用!需要在order前面加“!”

msleep %>% select(order, name, sleep_total) %>% 
  filter(! order %in% c("Didelphimorphia", "Diprotodontia"))
# A tibble: 79 x 3
   order        name                       sleep_total
   <chr>        <chr>                            <dbl>
 1 Carnivora    Cheetah                           12.1
 2 Primates     Owl monkey                        17 

3 正则匹配实现筛选

两个主要函数:基础包的 grepl() 函数, stringr 包的 str_detect() 函数

msleep %>% select(name, sleep_total) %>% 
  filter(str_detect(tolower(name), pattern = "mouse"))
# A tibble: 5 x 2
  name                       sleep_total
  <chr>                            <dbl>
1 Vesper mouse                       7  
2 House mouse                       12.5

注意:正则匹配时,R区分大小写!

四 基于逻辑筛选

主要筛选方式:

  • filter(condition1, condition2) 两个条件都符合;
  • filter(condition1, !condition2) 条件1是TRUE,条件2是FALSE;
  • filter(condition1 | condition2) 两个条件符合其中一个即可;
  • filter(xor(condition1, condition2) 只有一个条件符合!两个都符合不可以。

1)筛选 (bodywt大于100 ) 且 (sleep_total大于15 或者 order不为Carnivora )

msleep %>% select(name, order, sleep_total:bodywt) %>% 
  filter(bodywt > 100, (sleep_total > 15 | order != "Carnivora")) %>% head(2)
# A tibble: 2 x 8
  name           order        sleep_total sleep_rem sleep_cycle awake brainwt bodywt
  <chr>          <chr>              <dbl>     <dbl>       <dbl> <dbl>   <dbl>  <dbl>
1 Cow            Artiodactyla         4         0.7       0.667  20     0.423    600
2 Asian elephant Proboscidea          3.9      NA        NA      20.1   4.60    2547

额 ,一定要注意逻辑!多个条件可以用AND, OR ,NOT 组合。

筛选非空行

is.na内置完成 NA的筛选

#去除conservation是NA的所有行
msleep %>% select(name, conservation:sleep_cycle) %>% 
  filter(!is.na(conservation))
# A tibble: 54 x 5
   name                       conservation sleep_total sleep_rem sleep_cycle
   <chr>                      <chr>              <dbl>     <dbl>       <dbl>
 1 Cheetah                    lc                  12.1      NA        NA    
 2 Mountain beaver            nt                  14.4       2.4      NA  

五 跨多列筛选

主要筛选函数:

  • filter_all() 所有列参与筛选,根据筛选条件筛选
  • filter_if() 逻辑判断确定哪些列参与筛选,根据筛选条件筛选
  • filter_at() vars()函数定义哪些列参与筛选,根据筛选条件筛选

首先指定哪些列,然后确定筛选器的条件,多数情况下,需要.操作符引向待筛选的值。

1 filter_all()筛选所有行

#筛选name:order, sleep_total, -vore中,任何一列包含“Ca”的所有行
msleep %>% select(name:order, sleep_total, -vore) %>% 
  filter_all(any_vars(str_detect(., pattern = "Ca")))
# A tibble: 16 x 4
   name              genus        order        sleep_total
   <chr>             <chr>        <chr>              <dbl>
 1 Cheetah           Acinonyx     Carnivora           12.1
 2 Northern fur seal Callorhinus  Carnivora            8.7

注:any_vars() 类似OR,all_vars()则类似AND

#筛选name, sleep_total:bodywt, -awake列中,所有列均大于1的所有行
msleep %>%  select(name, sleep_total:bodywt, -awake) %>% 
  filter_all(all_vars(. > 1))
# A tibble: 1 x 6
  name  sleep_total sleep_rem sleep_cycle brainwt bodywt
  <chr>       <dbl>     <dbl>       <dbl>   <dbl>  <dbl>
1 Human           8       1.9         1.5    1.32     62

2 filter_if()筛选条件列

msleep %>% 
  select(name:order, sleep_total:sleep_rem) %>% 
  filter_if(is.character, any_vars(is.na(.)))
# A tibble: 7 x 6
  name            genus       vore  order          sleep_total sleep_rem
  <chr>           <chr>       <chr> <chr>                <dbl>     <dbl>
1 Vesper mouse    Calomys     NA    Rodentia               7        NA  
2 Desert hedgehog Paraechinus NA    Erinaceomorpha        10.3       2.7

注:同样可以使用 is.numeric, is.integer, is.double, is.logical, is.factor判别,日期数据的话,可以加载 lubridate 包,使用 is.POSIXt 或者 is.Date.

3 filter_at()筛选条件列

优点:自定义待筛选的列,无需指定待筛选的列的类型

#筛选sleep_total, sleep_rem两个变量,所有值均大于5的行
msleep %>% 
  select(name, sleep_total:sleep_rem, brainwt:bodywt) %>% 
  filter_at(vars(sleep_total, sleep_rem), all_vars(.>5))
# A tibble: 2 x 5
  name                 sleep_total sleep_rem brainwt bodywt
  <chr>                      <dbl>     <dbl>   <dbl>  <dbl>
1 Thick-tailed opposum        19.4       6.6  NA       0.37
2 Giant armadillo             18.1       6.1   0.081  60 

当然也可以使用正则表达式

msleep %>% 
  select(name, sleep_total:sleep_rem, brainwt:bodywt) %>% 
  filter_at(vars(contains("sleep")), all_vars(.>5))
# A tibble: 2 x 5
  name                 sleep_total sleep_rem brainwt bodywt
  <chr>                      <dbl>     <dbl>   <dbl>  <dbl>
1 Thick-tailed opposum        19.4       6.6  NA       0.37
2 Giant armadillo             18.1       6.1   0.081  60 

好了,筛选行大概介绍这么多,应该能解决大部分筛选问题。

参考资料

《R数据科学》

https://r4ds.had.co.nz/introduction.html

https://suzanbaert.netlify.com/2018/01/dplyr-tutorial-1/

本文分享自微信公众号 - 生信补给站(Bioinfo_R_Python),作者:生信补给站

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • tidyverse|数据分析常规操作-分组汇总(sumamrise+group_by)

    汇总函数 summarise(),可以将数据框折叠成一行 ,多与group_by()结合使用

    西游东行
  • 生信代码:数据处理( tidyverse包)

    大家在学习R语言的时候,大多参考《R语言实战》这本书,但这本书年代过于久远(中文第二版是2016年),主要着力点也是在R base上,R语言可视化的ggplot...

    科研菌
  • tidyverse:R语言中相当于python中pandas+matplotlib的存在

    tidyverse就是Hadley Wickham将自己所写的包整理成了一整套数据处理的方法,包括ggplot2、dplyr、tidyr、readr、purrr...

    拴小林
  • 独家 | 浅谈Python/Pandas中管道的用法

    我是R语言的忠实粉丝,并且靠它吃饭。特别提一下Tidyverse,它是一个功能强大、简洁易懂且文档齐全的数据科学平台。我在此向每一位初学者强烈推荐免费的在线电子...

    数据派THU
  • 「R」数据操作(五):dplyr 介绍与数据过滤

    在对数据进行可视化之前我们往往需要进行数据转换以得到可视化所需要的数据内容与格式。这里我们使用dplyr包操作2013年纽约市的航班起飞数据集(2013)。

    王诗翔呀
  • 使用dplyr进行数据转换

    dplyr最常用的5个函数: • 按值筛选观测(filter())。 • 对行进行重新排序(arrange())。 • 按名称选取变量(select())...

    生信编程日常
  • Quantopian 入门系列二 - 流水线 (下)

    本贴接着上贴〖Quantopian 入门系列二 - 流水线 (上)〗的内容,讨论下面目录的 5- 8 节:

    用户5753894
  • Tidyverse|数据列的分分合合,一分多,多合一

    比如基因列为ID的需要转为常见的symbol,基因列为symbol|ID的就需要拆开了!

    西游东行
  • R 语言 逻辑运算:TRUE/FALSE | 专题3

    逻辑运算是数学运算的重要组成部分,但其更是计算机计算的底层设置。作为一门数据处理语言,逻辑运算在R中承担着非常非常重要的作用。本专题就专门为大家整理一下R语言中...

    拴小林

扫码关注云+社区

领取腾讯云代金券