2013-12-11 39 views
5

我有一個包含一些NA的數據框,當我索引它時,我想R忽略該列中的NAs。如何在索引到數據框時誘使R「忽略」NA?

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 

數據框,我想回去的是:

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

但無論出於何種原因,R來港出整個行遇到「色」的NA時。我已經習慣了'na.exclude','na.pass'等,但還沒有找到一個乾淨的方法來做到這一點。

+0

你的問題的標題似乎反對的內容。您不希望R「忽略」NA,而是在您的選擇列中識別幷包含NA的行。 –

回答

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

即將發佈此解決方案。 –

2

也許是更好的在這種情況下使用setdiff

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,原因是看到該結果是由於您的子集邏輯的結果:'假$ color!='red''。由於「NA」不具有可比性,因此可以得到這兩行。 – Justin

2

你正在通過!=絆倒返回NA,而不是TRUE。這應該會成功:

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

沒什麼等於==,NA,此外沒有什麼是不等於!=,以NA,甚至NA。注意:

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

> NA == NA 
[1] NA 

但NA的可以給你想要的東西使用或combinied時,|

> NA | TRUE 
[1] TRUE