【问题标题】:How to use dplyr across to filter NA in multiple columns [duplicate]如何使用 dplyr 过滤多列中的 NA [重复]
【发布时间】:2021-02-28 18:37:11
【问题描述】:

我正在尝试过滤掉多列中具有 NA 值的行。只有当所有感兴趣的列都是 NA 时,才应该删除一行。

场景与此问题相同(但我没有足够的声誉发表评论):filtering data frame based on NA on multiple columns

其中一种解决方案是使用:

library(dplyr)
df_non_na <- df %>% filter_at(vars(type,company),all_vars(!is.na(.)))

由于“filter_at”在 dplyr 中被贬值,我如何使用“filter”和“across”来获得类似的结果?

【问题讨论】:

标签: r dplyr


【解决方案1】:

我们可以使用across 循环遍历“type”、“company”列并返回指定列中没有任何 NA 的行

library(dplyr)
df %>%
     filter(across(c(type, company), ~ !is.na(.)))
#     id  type company
#1  3 North    Alex
#2 NA North     BDA

对于filter,有两个选项类似于all_vars/any_varsfilter_at/filter_all 一起使用

df %>%
  filter(if_any(c(company, type), ~ !is.na(.)))
#  id  type company
#1  2  <NA>     ADM
#2  3 North    Alex
#3  4 South    <NA>
#4 NA North     BDA
#5  6  <NA>      CA

或使用if_all

df %>%
  filter(if_all(c(company, type), ~ !is.na(.)))
#   id  type company
#1  3 North    Alex
#2 NA North     BDA

数据

df <- structure(list(id = c(1L, 2L, 3L, 4L, NA, 6L), type = c(NA, NA, 
"North", "South", "North", NA), company = c(NA, "ADM", "Alex", 
NA, "BDA", "CA")), class = "data.frame", row.names = c(NA, -6L
))

【讨论】:

  • 有没有办法修改它,以便只删除具有多个“NA”值的行?例如,只删除 df 中的第一行(其中“type”和“company”都是 NA)。
  • @etrowbridge 请检查更新的解决方案
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2020-09-16
  • 2019-07-14
相关资源
最近更新 更多