web-dev-qa-db-fra.com

Suppression des observations NA avec dplyr :: filter ()

Mes données ressemblent à ceci:

library(tidyverse)

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

Je peux supprimer toutes les observations NA avec drop_na():

df %>% drop_na()

Ou supprimez toutes les observations NA dans une seule colonne (a par exemple):

df %>% drop_na(a)

Pourquoi ne puis-je pas simplement utiliser un tuyau de filtre != Normal?

df %>% filter(a != NA)

Pourquoi devons-nous utiliser une fonction spéciale de tidyr pour supprimer les NA?

24
emehex

De @Ben Bolker:

[T] son ​​n'a rien à voir spécifiquement avec dplyr :: filter ()

De @Marat Talipov:

[A] ny comparaison avec NA, y compris NA == NA, renverra NA

D'un réponse connexe par @farnsy:

L'opérateur == ne traite pas les NA comme vous vous y attendez.

Pensez à NA comme signifiant "Je ne sais pas ce qu'il y a". La bonne réponse à 3> NA est évidemment NA car nous ne savons pas si la valeur manquante est supérieure à 3 ou non. Eh bien, c'est la même chose pour NA == NA. Ce sont deux valeurs manquantes, mais les vraies valeurs peuvent être très différentes, donc la bonne réponse est "je ne sais pas".

R ne sait pas ce que vous faites dans votre analyse, donc au lieu d'introduire potentiellement des bogues qui finiraient par être publiés et vous embarrasserait, il ne permet pas aux opérateurs de comparaison de penser que NA est une valeur.

21
emehex

Par exemple:

vous pouvez utiliser:

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

pour supprimer l'AN dans la colonne a.

24
JeffZheng