2011-07-06 27 views
3

试图根据从SQL借用的数据框的子集获取非空值。尝试像这样:检查子集中的定义值()

lately <- subset(data, year > 1997 & myvalue != NA) 

但这是不对的。任何提示,r'sters?

+0

数据? “不正确”的定义?我们不是读心者。 –

回答

7
subset(data, year > 1997 & !is.na(myvalue)) 

应该这样做。您的版本不起作用的原因是foo != NAfoo == NA始终是NA,因为我们不知道NA数据是什么。使用is.na()来测试NA,如果你想要“不是NA”,则使用!否定它。

例如为:

> dat <- data.frame(year = 1995:2000, myvalue = c(1,3,4,NA,6,10)) 
> dat 
    year myvalue 
1 1995  1 
2 1996  3 
3 1997  4 
4 1998  NA 
5 1999  6 
6 2000  10 
> subset(dat, year > 1997 & myvalue != NA) 
[1] year myvalue 
<0 rows> (or 0-length row.names) 
> subset(dat, year > 1997 & !is.na(myvalue)) 
    year myvalue 
5 1999  6 
6 2000  10 

这是有益的,为什么您的版本不起作用进一步思考。

的子句返回的第一部分:

> with(dat, year > 1997) 
[1] FALSE FALSE FALSE TRUE TRUE TRUE 

对于我们并不需要做任何进一步的检查,因为它们是假的前3个元素,但我们需要检查一下第二条条款的最后示例中有三个元素。第二子句返回NA所有元素,如以上所讨论的:

> with(dat, myvalue != NA) 
[1] NA NA NA NA NA NA 

因此,合并的子句返回:

> with(dat, year > 1997 & myvalue != NA) 
[1] FALSE FALSE FALSE NA NA NA 

这将最终没有选择任何行,并且因此零行对象返回的为你举例。

+0

谢谢你的深思。 – Wells