检查subset()中的定义值

时间:2011-07-06 21:53:50

标签: r

尝试从SQL借用非空的值来获取数据帧的子集。尝试类似的事情:

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

但那不对。任何提示,rsters?

1 个答案:

答案 0 :(得分:7)

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

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

E.g:

> 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个元素,我们不需要进行任何进一步的检查,因为它们是FALSE,但是我们需要检查示例中最后三个元素的第二个子句。第二个子句为所有元素返回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

最终不会选择任何行,因此为您的示例返回了零行对象。