2017-05-18 12 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 -zerz-in-an-r-dataframe) – amonk

+0

@ageromリンクは重複ではない、OPは何かでNAを置き換えようとしていない – Cath

答えて

2
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

要素が存在しない場合、それは全体のデータセットを返しますよう私たちは

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

を削除するis.naとの論理インデックスを使用することができます

それとも、(@thelatemailがコメントしたように)

書き込むことができます:あなたが適切に NA Sを処理するために、代わりに ==%in%を使用することができます
df[df$a4!=6 | (is.na(df$a4)),] 
+4

なぜダブル! 'df [df $ a4!= 6 | is.na(df $ a4)、] ' – thelatemail

+0

ええ、それは両方とも動作しているようです!ありがとう! – KDBoom