尝试从SQL借用非空的值来获取数据帧的子集。尝试类似的事情:
lately <- subset(data, year > 1997 & myvalue != NA)
但那不对。任何提示,rsters?
答案 0 :(得分:7)
subset(data, year > 1997 & !is.na(myvalue))
应该这样做。您的版本不起作用的原因是foo != NA
或foo == 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
最终不会选择任何行,因此为您的示例返回了零行对象。