R语言基础入门(2) filter的使用方法从基础到高级

今天来介绍tidyverse体系重要的一员dplyr,作为数据处理的一大利器dplyr如它的外观一样,学好dplyr的使用数据处理将变得异常简单,今天来介绍dplyr中过滤函数filter的使用方法

> iris %>% as_tibble()
# A tibble: 150 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1          5.1         3.5          1.4         0.2 setosa 
 2          4.9         3            1.4         0.2 setosa 
 3          4.7         3.2          1.3         0.2 setosa 
 4          4.6         3.1          1.5         0.2 setosa 
 5          5           3.6          1.4         0.2 setosa 
 6          5.4         3.9          1.7         0.4 setosa 
 7          4.6         3.4          1.4         0.3 setosa 
 8          5           3.4          1.5         0.2 setosa 
 9          4.4         2.9          1.4         0.2 setosa 
10          4.9         3.1          1.5         0.1 setosa 
# … with 140 more rows

还是使用我们熟悉的iris(鸢尾花)数据集,可以看到数据有5列,150行,数据类型为数据框;分别表示Sepal.Length(花萼长度),Sepal.Width(花萼宽度)、Petal.Length(花瓣长度),Petal.Width(花瓣宽度)、Species(花的类型),其中花有3种类型(setosa、versicolor、virginica)

基本行过滤

筛选出含有setosa的行,注意是 ==

iris %>% as_tibble() %>% filter(Species=="setosa")

筛选出不含有setosa的行,R中!= 代表不等于

iris %>% as_tibble() %>% filter(Species !="setosa")

# 此2种方法结果一致,处理复杂数据时推荐第二种
iris %>% as_tibble() %>% filter(!Species %in% "setosa")

根据2个关键词进行筛选 通过%in%进行判断

iris %>% as_tibble() %>% 
  filter(.,Species %in% c("setosa","virginica"))

!Species 表示不包含在其中,此处注意前面的.,

iris %>% as_tibble() %>% 
  filter(.,!Species %in% c("setosa","virginica"))

根据多个条件进行筛选

  • filter(condition1, condition2) 将返回同时满足两个条件的行
  • filter(condition1, !condition2) 将返回条件一为真但条件二为不成立的所有行
  • filter(condition1 | condition2) 将返回满足条件1和/或条件2的行
  • filter(xor(condition1, condition2) 将返回仅满足一个条件的所有行,而不是同时满足两个条件的所有行
iris %>% as_tibble() %>% 
  filter(Species=="setosa",Sepal.Length >= 5)

& 在R中表示和的意思与,作用一致;|或的意思

iris %>% as_tibble() %>% 
  filter(.,(Species=="setosa" & !Sepal.Length >= 5))
iris %>% as_tibble() %>% 
  filter(.,(Species=="setosa" | Sepal.Length >= 5))

重点xor

xor只返回仅满足一个条件的所有行,而不是同时满足两个条件的所有行
c(T,F) | c(F,T)2种情况

iris %>% as_tibble() %>% 
  filter(.,xor(Species=="setosa",Sepal.Length >= 5))

可通过以下代码验证上面的结果

iris %>% as_tibble() %>% 
  filter(.,(Species=="setosa" & !Sepal.Length >= 5))
iris %>% as_tibble() %>% 
  filter(.,Species!= "setosa",Sepal.Length >= 5)

多条件嵌套过滤

此代码将首先提取出含有setosa的行,
之后根据Sepal.Length >= 5这一条件对其进行过滤,
最后将含有versicolor","virginica"的数据追加上去

iris %>% as_tibble() %>% 
  filter(.,(Species=="setosa" & Sepal.Length >= 5)|(Species %in% c("versicolor","virginica")))

删除Species中含有NA的行

iris %>% filter(!is.na(Species))

跨多列过滤

  • filter_all() 过滤所有列
  • filter_if()需要一个返回的布尔值以指示要过滤列的类型。如果是符合条件则将遵循这些列进行过滤
  • filter_at()要求在vars() 参数中指定要进行过滤的列

filter_all( )

对数值执行全部筛选:此代码将保留任何值等于5的行

iris %>% filter_all(any_vars(. == 5))

对字符串进行过滤,在所有列中检索含有"Ca"的字符串,需要将条件包装在any_vars()中

msleep %>% 
  select(name:order, sleep_total, -vore) %>% 
  filter_all(any_vars(str_detect(., pattern = "Ca")))

filter_if( )

下面这段代码首先对列的类型进行判断,再在字符列中筛选NA

msleep %>% 
  select(name:order, sleep_total:sleep_rem) %>% 
  filter_if(is.character, any_vars(is.na(.)))

filter_at( )

filter_at( )它不筛选所有列,也不需要您指定列的类型,可以通过vars() 参数选择要对那些列进行筛选

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

推荐阅读更多精彩内容