2011-09-24 97 views
1

我想從我的數據幀,其中第三列是NA刪除所有行:數據幀中的R - NA值

new.frame <- data[(!is.na(data$z)),] 

但我發現了一個錯誤。

Warning message: 
In is.na(data$z) : is.na() applied to non-(list or vector) of type 'NULL' 

我該如何做到這一點?

+4

這聽起來像你的數據框沒有一個名爲「z」的列。 – Owen

回答

9

請重複舉例。這是一個工程:

R> set.seed(42) 
R> DF <- data.frame(a=rnorm(10), b=sample(LETTERS, 10, replace=TRUE), 
+>     z=cumsum(runif(10))) 
R> DF[c(2,4,6),"z"] = NA 
R> DF 
      a b  z 
1 1.3709584 X 0.737596 
2 -0.5646982 D  NA 
3 0.3631284 Z 1.936759 
4 0.6328626 Y  NA 
5 0.4042683 C 2.625877 
6 -0.1061245 N  NA 
7 1.5115220 K 3.466127 
8 -0.0946590 X 3.673786 
9 2.0184237 L 4.580388 
10 -0.0627141 V 5.192166 
R> new.frame <- DF[(!is.na(DF$z)),] 
R> new.frame 
      a b  z 
1 1.3709584 X 0.737596 
3 0.3631284 Z 1.936759 
5 0.4042683 C 2.625877 
7 1.5115220 K 3.466127 
8 -0.0946590 X 3.673786 
9 2.0184237 L 4.580388 
10 -0.0627141 V 5.192166 
R> 
3

還有complete.cases()這可能更容易閱讀。利用德克的數據:

new.frame2 <- DF[complete.cases(DF) ,] 

> all.equal(new.frame, new.frame2) 
[1] TRUE 
+1

但'complete.cases'不會做你想要的,如果你在列('z')列以外的列中有'NA'值並且你想保留具有'NA'但沒有在這個列中的行列... –

0

試試這個:

new.frame.nonull <- data[(!is.null(data$z)),] 
new.frame <- new.frame.nonull[(!is.na(new.frame.nonull$z)),] 
+0

我認爲你的代碼需要一些清理。 – Dason

1

您也可以對整個數據集使用na.omit功能。