Réponses:
En essayant ?max
, vous verrez qu'il a en fait un na.rm =
argument, défini par défaut sur FALSE
. (C'est la valeur par défaut commun pour de nombreuses autres fonctions de R, y compris sum()
, mean()
, etc.)
Le réglage 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)]
Une dernière note: D' autres fonctions (par exemple table()
, lm()
et sort()
) ont des NA
arguments qui utilisent des noms concernant la PI (différents et offrent des options différentes). Donc, si cela 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 en a généralement un déjà là.
max()
se comporte (comme, par exemple, quand elle le fait max(c(NA, NA)
). Personnellement, je pense que son comportement est raisonnable; Je pense qu'il a été construit de cette façon pour que vous obteniez le résultat attendu lorsque vous faites des choses commea <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NA
gestion de type R dans l'excellent package NumPy de Python .)
NA
s d'un vecteur de NA
s, vous vous attendez à un vecteur vide, et non à -∞.
?max
vous montre qu'il existe un paramètre supplémentaire na.rm
que vous pouvez définir TRUE
.
En dehors de cela, si vous voulez vraiment supprimer les NA
s, utilisez simplement quelque chose comme:
myvec[!is.na(myvec)]
na.omit
également une méthode dataframe, c'est donc plus général.
Vous pouvez appeler max(vector, na.rm = TRUE)
. Plus généralement, vous pouvez utiliser la na.omit()
fonction.
Juste au cas où quelqu'un de nouveau chez R voudrait une réponse simplifiée à la question d'origine
Comment puis-je supprimer les valeurs NA d'un vecteur?
C'est ici:
Supposons que vous ayez 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 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.
Utilisation 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; utilisez également la fonction de sous-ensemble intégrée [
:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
Notez que na.omit
cela ne fonctionne pas sur les listes:
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
J'ai effectué un test rapide comparant les deux base
approches et il s'avère que x[!is.na(x)]
c'est plus rapide que na.omit
. L'utilisateur a qwr
suggéré d'essayer purrr::dicard
également - cela s'est avéré être beaucoup plus lent (même si je serai ravi de prendre connaissance des commentaires sur ma mise en œuvre et mon test!)
microbenchmark::microbenchmark(
purrr::map(airquality,function(x) {x[!is.na(x)]}),
purrr::map(airquality,na.omit),
purrr::map(airquality, ~purrr::discard(.x, .p = is.na)),
times = 1e6)
Unit: microseconds
expr min lq mean median uq max neval cld
purrr::map(airquality, function(x) { x[!is.na(x)] }) 66.8 75.9 130.5643 86.2 131.80 541125.5 1e+06 a
purrr::map(airquality, na.omit) 95.7 107.4 185.5108 129.3 190.50 534795.5 1e+06 b
purrr::map(airquality, ~purrr::discard(.x, .p = is.na)) 3391.7 3648.6 5615.8965 4079.7 6486.45 1121975.4 1e+06 c
Pour référence, voici le test original de x[!is.na(x)]
vs na.omit
:
microbenchmark::microbenchmark(
purrr::map(airquality,function(x) {x[!is.na(x)]}),
purrr::map(airquality,na.omit),
times = 1000000)
Unit: microseconds
expr min lq mean median uq max neval cld
map(airquality, function(x) { x[!is.na(x)] }) 53.0 56.6 86.48231 58.1 64.8 414195.2 1e+06 a
map(airquality, na.omit) 85.3 90.4 134.49964 92.5 104.9 348352.8 1e+06 b
purrr:discard
-Inf
pour und
de tous les NA.