2017-05-18 50 views
1
有条件删除行的

我的例子DF:在数据帧,其中包括NA

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

可能重复[我如何用R数据框中的零替换NA值?](http://stackoverflow.com/questions/8161836/how-do-i-replace-na-values-with -zeros-in-an-r-dataframe) – amonk

+0

@agerom链接不是一个骗局,OP不是试图用任何东西替换NAs – Cath

回答

2

您可以使用%in%代替==妥善处理NA S:

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 
+0

太棒了!我不知道类似“%in%”的内容。 TIL :)谢谢! – KDBoom

2

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

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

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

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

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

为什么双“!”? 'df [df $ a4!= 6 | is.na(df $ a4),]' – thelatemail

+0

是的,它似乎都在工作!谢谢! – KDBoom