2013-12-11 28 views
5

Bazı NA'ları içeren bir veri çerçevem ​​var ve ona indekslendiğinde, R'nin o sütundaki NA'ları yoksaymasını istiyorum.Bir veri çerçevesine indekslenirken NA'ları "yoksaymak" için R'yi nasıl tetiklersiniz?

fake = data.frame(id = 1:5, 
        color = c('red', NA, NA, 'blue', 'blue'), 
        value = rnorm(5)) 

sub = fake[fake$color != 'red', ] 

    id color  value 
NA NA <NA>   NA 
NA.1 NA <NA>   NA 
4  4 blue -0.3227421 
5  5 blue -1.0196561 

dataframe geri is istiyorum:

id color  value 
2 2 <NA> 0.2761862 
3 3 <NA> 1.0029380 
4 4 blue -0.3227421 
5 5 blue -1.0196561 

Ama sebebi ne olursa olsun, tüm satırdaki dışarı R Nas 'renk' bir NA ile karşılaştı. 'Na.exclude', 'na.pass' vb. Ile iş yaptım, ancak bunu yapmanın temiz bir yolunu bulamadım.

+0

Sorunuzun başlık | içeriğine karşı görünüyor,

> is.na(fake$color) | fake$color != 'red' [1] FALSE TRUE TRUE TRUE TRUE > NA == NA [1] NA 

Ama NA adlı VEYA kullanarak combinied zaman istediğini verebilir: dikkat edin. Eğer NA sizin seçim sütununda NA ile tanımak ve satır içeren NA'ları "yok saymak" istemezsiniz. –

cevap

4
fake[!fake$color %in% "red",] 
# id color  value 
# 2 2 <NA> -1.1341590 
# 3 3 <NA> -0.6181337 
# 4 4 blue 0.6115878 
# 5 5 blue 1.3984797 
+0

Bu çözümü göndermek üzereydi. –

2

Belki de bu durumda setdiff kullanmak daha iyidir: Sen DOĞRU yerine NA dönen != tarafından takıldı alıyorsanız

fake[setdiff(rownames(fake), which(fake$color == "red")), ] 
# id color  value 
# 2 2 <NA> 1.015132 
# 3 3 <NA> -1.425210 
# 4 4 blue 1.089207 
# 5 5 blue 1.442323 
+1

FWIW, sonucun alt küme mantığınızın sonucundan kaynaklandığını görmekti: 'fake $ color! = 'Red''. 'NA' karşılaştırılabilir olmadığından, bu iki satırı alırsınız. – Justin

2

. ,

sub = fake[ is.na(fake$color) | fake$color != 'red', ] 

Hiçbir şey == eşittir NA ve dahası hiçbir şey NA, değil bile NA için, !=-eşit değildir: Bu başarılı olması.

> NA | TRUE 
[1] TRUE 
İlgili konular