有条件地删除数据框中包含 NA 的行

Conditionally remove of rows in dataframe which includes NA

我的例子 df:

  a1 a2 a3 a4
1  1  1  4  6
2  1  2  3  2
3  2 NA  5 NA
4  2  5  6  3
5  3  1  1  2
6  3  3  2  6

"If a4 == 6 then delete this row." 因此,我想删除(仅!)此示例中的第 1 行和第 6 行。

我知道这行得通:

df_1 <- df[-c(1, 6), ]

但我正在寻找更通用的解决方案。

我试过最明显的方法:

attach(df)
df_1 <- df[ which(a4 != 6),]
detach(df)

但是,这也会删除所有 NA,我想保留它们。

  a1 a2 a3 a4
2  1  2  3  2
4  2  5  6  3
5  3  1  1  2

然后我尝试了:

df_1 <-df[!(df$a4 == 6),]

但随后第 3 行跳入边缘,整行变为 NA

   a1 a2 a3 a4
2   1  2  3  2
NA NA NA NA NA
4   2  5  6  3
5   3  1  1  2

有什么想法吗? 提前致谢!

我们可以使用带有is.na的逻辑索引来移除

df[!(df$a4 == 6 & !is.na(df$a4)),]

因为当元素不存在时它将return整个数据集

或者也可以这样写(如@thelatemail评论的)

df[df$a4!=6 | (is.na(df$a4)),]

您可以使用 %in% 而不是 == 来正确处理 NAs:

df[!(df$a4 %in% 6),]
#  a1 a2 a3 a4
#2  1  2  3  2
#3  2 NA  5 NA
#4  2  5  6  3
#5  3  1  1  2