首页 > > > 【R语言】tidyverse之五:选择行
按行提取子集:选择行、删除行,对行排序。
先创建一个包含重复行的数据框:
set.seed(896)
sw_dup <-
starwars %>%
select(-(films:starships)) %>%
sample_n(100, replace=TRUE)
sw_dup
用 dplyr 包中的 arrange() 对行排序,默认是递增。
sw_dup %>%
arrange(name, gender)
若要递减排序,套一个 desc():
sw_dup %>%
arrange(desc(mass)) # 递减排序
用 dplyr 包中的 distinct() 删除重复行(只保留第1个,删除其余)。
sw_dup %>%
distinct() %>%
glimpse() %>%
anyDuplicated() # 查看重复行数
也可以只根据某些列判定重复:
sw_dup %>%
distinct(species, homeworld) %>% # 只根据 species 和 homeworld 判定重复
glimpse() %>%
anyDuplicated()
注:默认只返回选择的列,要返回所有列,需要设置参数 .keep_all=TRUE.
用 tidyr 包中的 drop_na() 删除所有包含 NA 的行:
sw_dup %>%
drop_na() %>%
glimpse() %>%
anyNA()
也可以只删除某些列包含 NA 的行:
sw_dup %>%
drop_na(gender:species) %>%
glimpse() %>%
anyNA()
2. 用 filter() 根据值或条件选择行
sw_dup %>%
filter(species == "Human", homeworld != "Earth") 
注:多个条件之间用“,”隔开,相当于 and.
sw_dup %>%
filter(species == "Human", (is.na(mass) | height > 180))
sw_dup %>%
filter(between(height, 100, 170)) 
3. 在限定列范围内根据条件选择行
结合变量选择器: vars(), any_vars() (存在), all_vars() (所有)以及类型判断函数 is.numeric(), is.factor() 等,可以在限定列范围内,根据条件选择行。
(1)filter_all(): 在所有这样的列范围内,选择行
选出所有列范围内,存在值包含 "bl" 的行
sw_dup %>%
filter_all(any_vars(str_detect(., pattern="bl")))
选出所有列范围内,存在值 >7.5 的行
iris[,1:4] %>%
as_tibble() %>%
filter_all(any_vars(. > 7.5))
选出所有列范围内,所有值均 >2.4 的行
iris[,1:4] %>%
as_tibble() %>%
filter_all(all_vars(. > 2.4))
(2)filter_if():满足条件的列范围内,选择行
从字符列范围内,选择包含 NA 的行:
sw_dup %>%
filter_if(is.character, any_vars(is.na(.)))
(3)filter_at():在某些列范围内,选择行
在包含 "Sepal" 的列范围内,选择存在值 > 4 的行:
iris[,1:4] %>%
as_tibble() %>%
filter_at(vars(contains("Sepal")), all_vars(. > 4))
____________________________________
转载请注明,禁止用于出版。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3165139/ ,如需转载,请注明出处,否则将追究法律责任。