web-dev-qa-db-fra.com

Supprimer les valeurs NA d'un vecteur

J'ai un énorme vecteur qui a quelques valeurs NA, et j'essaie de trouver la valeur maximale dans ce vecteur (le vecteur est composé de nombres), mais je ne peux pas le faire à cause du NA valeurs.

Comment puis-je supprimer les valeurs NA afin de pouvoir calculer le maximum?

169
CodeGuy

En essayant ?max, vous verrez qu'il a en fait un argument na.rm =, défini par défaut sur FALSE. (C'est la valeur par défaut commune à beaucoup d'autres fonctions R, notamment sum(), mean(), etc.)

Régler na.rm=TRUE fait exactement ce que vous demandez:

d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)

Si vous souhaitez supprimer tous les NAs, utilisez plutôt cet idiome:

d <- d[!is.na(d)]

Remarque finale: les autres fonctions (par exemple, table(), lm() et sort()) ont des arguments liés à NA qui utilisent des noms différents (et offrent différentes options). Donc, si NA vous pose des problèmes lors d'un appel de fonction, il vaut la peine de rechercher une solution intégrée parmi les arguments de la fonction. J'ai trouvé qu'il y a généralement un déjà là.

236
Josh O'Brien

La fonction na.omit correspond à ce que beaucoup de routines de régression utilisent en interne:

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
87
42-

?max vous indique qu'il existe un paramètre supplémentaire na.rm que vous pouvez définir sur TRUE.

En dehors de cela, si vous vraiment voulez supprimer les NAs, utilisez simplement quelque chose comme:

myvec[!is.na(myvec)]
17
Nick Sabbe

Vous pouvez appeler max(vector, na.rm = TRUE). Plus généralement, vous pouvez utiliser la fonction na.omit().

13
Michael Hoffman

Juste au cas où quelqu'un de nouveau à R voudrait une réponse simplifiée à la question initiale

Comment puis-je supprimer les valeurs NA d'un vecteur?

C'est ici:

Supposons que vous avez un vecteur foo comme suit:

foo = c(1:10, NA, 20:30)

courir length(foo) donne 22.

nona_foo = foo[!is.na(foo)]

length(nona_foo) est égal à 21, car les valeurs NA ont été supprimées.

Remember is.na(foo) renvoie une matrice booléenne, donc l'indexation foo avec l'opposé de cette valeur vous donnera tous les éléments qui ne sont pas NA.

12
Scott C Wilson

Utilisez discard de purrr (fonctionne avec des listes et des vecteurs).

discard(v, is.na) 

L'avantage est qu'il est facile d'utiliser des tuyaux; Vous pouvez également utiliser la fonction de sous-ensemble intégrée [:

v %>% discard(is.na)
v %>% `[`(!is.na(.))
1
qwr