有条件地删除包含NA

时间:2017-05-18 05:55:37

标签: r select 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

"如果a4 == 6则删除此行。" 所以,我想在这个例子中删除(仅!)第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

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

2 个答案:

答案 0 :(得分:2)

我们可以使用is.na的逻辑索引删除

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

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

或者可以写(如@thelatemail评论)

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

答案 1 :(得分:2)

您可以使用%in%代替==来正确处理NA

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