2017-05-18 47 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