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

首发于“生信补给站” ,https://mp.weixin.qq.com/s/l9Ci7wREQWpEV5dTvKuoHg,更多的R统计,绘图,生信,请移步🤭

上篇根据 msleep数据集,介绍了列的操作,盘一盘Tidyverse| 筛行选列之select,玩转列操作

本文盘一盘行的筛选!

一 载入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) 只有一个条件符合!两个都符合不可以。注意使用
Complete set of boolean operations. `x` is the left-hand circle, `y` is the right-hand circle, and the shaded region show which parts each operator selects.

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 组合

2 筛选非空行

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/

◆ ◆ ◆ ◆ ◆

精心整理(含图版)|你要的全拿走!有备无患 (R统计,ggplot2绘图,生信图形可视化汇总)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容