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?
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 NA
s, 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à.
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
?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 NA
s, utilisez simplement quelque chose comme:
myvec[!is.na(myvec)]
Vous pouvez appeler max(vector, na.rm = TRUE)
. Plus généralement, vous pouvez utiliser la fonction na.omit()
.
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.
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(.))