如何使用dplyr的across函数来筛选多列中的NA值

6

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

情景与这个问题相同(但我没有足够的声望发表评论):按多个列过滤数据框基于NA

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

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

"filter_at" 在 dplyr 中被弃用了,那么我如何使用 "filter" 和 "across" 来达到类似的效果呢?


1
这个回答解决了你的问题吗?dplyr根据多列条件过滤 - camille
1个回答

10

我们可以使用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时,有两个选项与filter_at/filter_all中使用的all_vars/any_vars类似。

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

:Or using if_all
    df %>%
      filter(!if_all(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

数据

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
@etrowbridge,请检查已更新的解决方案。 - akrun
1
我尝试使用 filter(if_all(c(variables), ~ !is.na(.))),但并没有按预期工作。我不得不将感叹号移动到 if_all() 之前。 - Michael Matta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接