我的例子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
有什么想法吗? 提前谢谢!
答案 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