Risposte:
Provando ?max
, vedrai che in realtà ha un na.rm =
argomento, impostato di default su FALSE
. (Questo è il difetto comune per molte altre funzioni, tra cui R sum()
, mean()
, etc.)
L'impostazione na.rm=TRUE
fa esattamente quello che stai chiedendo:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
Se vuoi rimuovere tutti NA
i messaggi, usa invece questo idioma:
d <- d[!is.na(d)]
Un'ultima nota: altre funzioni (ad es table()
. lm()
, E sort()
) hanno NA
argomenti correlati che usano nomi diversi (e offrono opzioni diverse). Quindi, se NA
si verificano problemi in una chiamata di funzione, vale la pena cercare una soluzione integrata tra gli argomenti della funzione. Ho scoperto che di solito ce n'è già uno lì.
max()
comportamento della funzione R di base (come, ad esempio, quando lo fai max(c(NA, NA)
). Personalmente, penso che il suo comportamento sia ragionevole; Mi aspetto che sia stato costruito in questo modo in modo da ottenere il risultato atteso quando si fanno cose comea <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NA
nell'incorporare le strutture di gestione di tipo R nell'eccellente pacchetto NumPy di Python .)
NA
s da un vettore di NA
s, ti aspetteresti un vettore vuoto, non -∞.
?max
mostra che esiste un parametro aggiuntivo na.rm
che è possibile impostare TRUE
.
A parte questo, se vuoi davvero rimuovere la NA
s, usa qualcosa come:
myvec[!is.na(myvec)]
na.omit
ha anche un metodo dataframe, quindi è più generale.
Puoi chiamare max(vector, na.rm = TRUE)
. Più in generale, è possibile utilizzare la na.omit()
funzione.
Nel caso in cui qualcuno nuovo a R desideri una risposta semplificata alla domanda originale
Come posso rimuovere i valori NA da un vettore?
Ecco qui:
Supponi di avere un vettore foo
come segue:
foo = c(1:10, NA, 20:30)
correre length(foo)
dà 22.
nona_foo = foo[!is.na(foo)]
length(nona_foo)
è 21, perché i valori NA sono stati rimossi.
Ricorda is.na(foo)
restituisce una matrice booleana, quindi indicizzare foo
con l'opposto di questo valore ti darà tutti gli elementi che non sono NA.
Usa discard
da purrr (funziona con elenchi e vettori).
discard(v, is.na)
Il vantaggio è che è facile usare tubi; in alternativa, utilizzare la funzione di subsetting integrata [
:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
Si noti che na.omit
non funziona sugli elenchi:
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
Ho eseguito un rapido benchmark confrontando i due base
approcci e risulta che x[!is.na(x)]
è più veloce di na.omit
. L'utente qwr
mi ha suggerito di provare purrr::dicard
anche questo - questo si è rivelato notevolmente più lento (anche se accetterò felicemente commenti sulla mia implementazione e 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
Per riferimento, ecco il test originale di 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
unad
di tutte le NA.