检查subset()中的定义值

Wel*_*lls 3 r

试图从SQL借用非空的值来获取数据帧的子集.尝试类似的东西:

lately <- subset(data, year > 1997 & myvalue != NA)
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*son 7

subset(data, year > 1997 & !is.na(myvalue))
Run Code Online (Sandbox Code Playgroud)

应该这样做.你的版本不起作用的原因是,foo != NA或者foo == NA总是NA因为我们不知道NA基准是什么.使用is.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
Run Code Online (Sandbox Code Playgroud)

进一步思考为什么你的版本不起作用是有益的.

该条款的第一部分返回:

> with(dat, year > 1997)
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

对于前3个元素,我们不需要进行任何进一步的检查,因为它们是FALSE,但是我们需要检查示例中最后三个元素的第二个子句.如上所述,第二个子句返回NA所有元素:

> with(dat, myvalue != NA)
[1] NA NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)

因此,合并条款返回:

> with(dat, year > 1997 & myvalue != NA)
[1] FALSE FALSE FALSE    NA    NA    NA
Run Code Online (Sandbox Code Playgroud)

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