subset(data, year > 1997 & !is.na(myvalue))
должен это сделать. Причина, по которой ваша версия не работает, в том, что foo != NA
или foo == 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
, что в итоге не выберет ни одной строки, и, следовательно, объект нулевой строки, возвращаемый для вашего примера.