首页 > 解决方案 > 仅当一列包含特定值时,删除至少包含 NA 的行

问题描述

我有以下数据框:

a  b  c
x  1  1
x  1  NA
y  NA 1
y  1  1

我想删除任何列中至少包含 NA 的行,但前提是“a”列包含“y”。因此,结果将是:

a  b  c
x  1  1
x  1  NA
y  1  1

到目前为止,我已经尝试过:

my_DF %>%
  filter(!(any(is.na(.)) & a == "y"))

但生成的数据框如下:

a  b  c
x  1  1
x  1  NA

所以这只会删除“a”包含“y”的任何行,无论该行是否还包含至少一列中的 NA。

如何更改命令的“any(is.na(.))”部分(我猜这是错误的部分)以使其正常工作?

标签: rdataframefilterdplyrna

解决方案


您可以使用在dplyr 1.0.4 中if_any引入并在函数中使用的新方法。以下代码将实现您所追求的结果:filter

my_DF %>% 
filter(!(a == "y" & if_any(everything(), ~ is.na(.x))))

个别位的解释

filter- 保留所有行

!- 这不是真的

everything()- 检查所有列(或者,您可以指定列名向量,例如c("b", "c")

if_any(everything(), ~ is.na(.x))- 如果任何列有 NA(还有一个if_all版本)

完全可重现的例子

my_DF <- data.frame(a = c("x", "x", "y", "y"),
                    b = c(1, 1, NA, 1),
                    c = c(1, NA, 1, 1))
my_DF %>% 
filter(!(a == "y" & if_any(everything(), ~ is.na(.x))))

推荐阅读