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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容