Удаление наблюдений NA с помощью dplyr:: filter()

Мои данные выглядят следующим образом:

library(tidyverse)

df <- tribble(
    ~a, ~b, ~c,
    1, 2, 3, 
    1, NA, 3, 
    NA, 2, 3
)

Я могу удалить все наблюдения NA с помощью drop_na():

df %>% drop_na()

Или удалите все наблюдения NA в одном столбце (например, a):

df %>% drop_na(a)

Почему я не могу использовать обычный трафик фильтра !=?

df %>% filter(a != NA)

Почему нам нужно использовать специальную функцию из tidyr для удаления NA?

Ответ 1

Из @Ben Bolker:

[T] его не имеет ничего общего с dplyr:: filter()

От @Марат Талыпов:

[A] ny сравнение с NA, включая NA == NA, вернет NA

От связанного ответа от @farnsy:

Оператор == не рассматривает NA так, как вы ожидали.

Подумайте о NA как о значении "Я не знаю, что там". Правильный ответ до 3 > NA, очевидно, NA, потому что мы не знаем, отсутствует ли недостающее значение больше 3 или нет. Ну, это то же самое для NA == NA. Они есть обе пропущенные значения, но истинные значения могут быть совершенно разными, поэтому правильный ответ: "Я не знаю".

R не знает, что вы делаете в своем анализе, поэтому вместо потенциально представляя ошибки, которые позже будут опубликованы смущающий вас, он не позволяет операторам сравнения думать NA это значение.

Ответ 2

Например:

вы можете использовать:

df %>% filter(!is.na(a))

чтобы удалить NA в столбце a.