今天来介绍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