Проверка определенных значений в подмножестве () - PullRequest
3 голосов
/ 07 июля 2011

Попытка получить подмножество фрейма данных на основе заимствования из SQL значений, которые не равны нулю. Попытка что-то вроде:

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

Но это не так. Любые советы, члены?

1 Ответ

7 голосов
/ 07 июля 2011
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

, что в итоге не выберет ни одной строки, и, следовательно, объект нулевой строки, возвращаемый для вашего примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...