2011-09-24 98 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功能。