今天來介紹tidyverse體系重要的一員dplyr沈撞,作為數(shù)據(jù)處理的一大利器dplyr如它的外觀一樣堕扶,學(xué)好dplyr的使用數(shù)據(jù)處理將變得異常簡單,今天來介紹dplyr中過濾函數(shù)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(鳶尾花)數(shù)據(jù)集龄毡,可以看到數(shù)據(jù)有5列薄声,150行,數(shù)據(jù)類型為數(shù)據(jù)框破镰;分別表示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種方法結(jié)果一致养渴,處理復(fù)雜數(shù)據(jù)時推薦第二種
iris %>% as_tibble() %>% filter(!Species %in% "setosa")
根據(jù)2個關(guān)鍵詞進(jìn)行篩選 通過
%in%
進(jìn)行判斷
iris %>% as_tibble() %>%
filter(.,Species %in% c("setosa","virginica"))
!Species
表示不包含在其中雷绢,此處注意前面的.,
iris %>% as_tibble() %>%
filter(.,!Species %in% c("setosa","virginica"))
根據(jù)多個條件進(jìn)行篩選
- 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))
重點(diǎn)xor
xor只返回僅滿足一個條件的所有行习寸,而不是同時滿足兩個條件的所有行
即c(T,F)
|c(F,T)
2種情況
iris %>% as_tibble() %>%
filter(.,xor(Species=="setosa",Sepal.Length >= 5))
可通過以下代碼驗(yàn)證上面的結(jié)果
iris %>% as_tibble() %>%
filter(.,(Species=="setosa" & !Sepal.Length >= 5))
iris %>% as_tibble() %>%
filter(.,Species!= "setosa",Sepal.Length >= 5)
多條件嵌套過濾
此代碼將首先提取出含有
setosa
的行胶惰,
之后根據(jù)Sepal.Length >= 5
這一條件對其進(jìn)行過濾傻工,
最后將含有versicolor","virginica"
的數(shù)據(jù)追加上去
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()需要一個返回的布爾值以指示要過濾列的類型。如果是符合條件則將遵循這些列進(jìn)行過濾
- filter_at()要求在vars() 參數(shù)中指定要進(jìn)行過濾的列
filter_all( )
對數(shù)值執(zhí)行全部篩選:此代碼將保留任何值等于5的行
iris %>% filter_all(any_vars(. == 5))
對字符串進(jìn)行過濾孵滞,在所有列中檢索含有"Ca"的字符串中捆,需要將條件包裝在any_vars()中
msleep %>%
select(name:order, sleep_total, -vore) %>%
filter_all(any_vars(str_detect(., pattern = "Ca")))
filter_if( )
下面這段代碼首先對列的類型進(jìn)行判斷,再在字符列中篩選
NA
msleep %>%
select(name:order, sleep_total:sleep_rem) %>%
filter_if(is.character, any_vars(is.na(.)))
filter_at( )
filter_at( )它不篩選所有列坊饶,也不需要您指定列的類型,可以通過vars() 參數(shù)選擇要對那些列進(jìn)行篩選
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