ITPub博客

首页 > > > 【R语言】tidyverse之五:选择行

【R语言】tidyverse之五:选择行

作者:浪花小雨滴 时间:2020-06-17 10:47:25 0 删除 编辑

按行提取子集:选择行、删除行,对行排序。

先创建一个包含重复行的数据框:

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.

三. 删除包含 NA 的行

用 tidyr 包中的 drop_na() 删除所有包含 NA 的行:

sw_dup %>%
  drop_na() %>%
  glimpse() %>%
  anyNA()

也可以只删除某些列包含 NA 的行:

sw_dup %>%
  drop_na(gender:species) %>%
  glimpse() %>%
  anyNA()

四. 选择行

  1. 随机选择若干行
  • sample_n(df, m) :随机选择 m 行;
  • sample_frac(df, 0.1) :随机选择 10% 的行。

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))


参考文献:

  1. Desi Quintans, Jeff Powell. Working in the Tidyverse. hiercourse.com/
  2. SuZan. Data Wrangling Part 3: Basic and more advanced ways to filter rows. suzan.rbind.io/2018/02/
  3. Garrett Grolemund, Hadley Wickham. R for Data Science. r4ds.had.co.nz/


____________________________________

转载请注明,禁止用于出版。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3165139/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    40011