Antworten:
Wenn ?max
Sie es versuchen , werden Sie feststellen, dass es tatsächlich ein na.rm =
Argument gibt, das standardmäßig auf gesetzt ist FALSE
. (Das ist der gemeinsame Standard für viele andere R - Funktionen, einschließlich sum()
, mean()
etc.)
Die Einstellung na.rm=TRUE
macht genau das, wonach Sie fragen:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
Wenn Sie alle NA
s entfernen möchten , verwenden Sie stattdessen diese Redewendung:
d <- d[!is.na(d)]
Eine letzte Anmerkung: Weitere Funktionen (zB table()
, lm()
und sort()
) haben NA
-related Argumente , die unterschiedliche Namen verwenden (und bieten verschiedene Möglichkeiten). Wenn NA
Sie also Probleme bei einem Funktionsaufruf haben, sollten Sie nach einer integrierten Lösung unter den Argumenten der Funktion suchen. Ich habe festgestellt, dass es normalerweise schon einen gibt.
max()
verhält (wie zum Beispiel, wenn Sie dies tun max(c(NA, NA)
). Persönlich halte ich sein Verhalten für vernünftig; Ich gehe davon aus, dass es so konstruiert wurde, dass Sie das erwartete Ergebnis erhalten, wenn Sie Dinge tun wiea <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NA
Handhabungsfunktionen in Pythons ausgezeichnetes NumPy- Paket integriert haben.)
NA
s aus einem Vektor von NA
s entfernen , erwarten Sie einen leeren Vektor, nicht -∞.
?max
zeigt Ihnen, dass es einen zusätzlichen Parameter gibt na.rm
, den Sie einstellen können TRUE
.
Abgesehen davon, wenn Sie das s wirklich entfernen möchten NA
, verwenden Sie einfach etwas wie:
myvec[!is.na(myvec)]
na.omit
hat auch eine Datenrahmenmethode, ist also allgemeiner.
Sie können anrufen max(vector, na.rm = TRUE)
. Im Allgemeinen können Sie die na.omit()
Funktion verwenden.
Nur für den Fall, dass jemand, der neu bei R ist, eine vereinfachte Antwort auf die ursprüngliche Frage wünscht
Wie kann ich NA-Werte aus einem Vektor entfernen?
Hier ist es:
Angenommen, Sie haben einen Vektor foo
wie folgt:
foo = c(1:10, NA, 20:30)
Laufen length(foo)
gibt 22.
nona_foo = foo[!is.na(foo)]
length(nona_foo)
ist 21, weil die NA-Werte entfernt wurden.
Denken Sie daran, dass is.na(foo)
eine boolesche Matrix zurückgegeben wird. Wenn Sie also foo
mit dem Gegenteil dieses Werts indizieren , erhalten Sie alle Elemente, die nicht NA sind.
Verwendung discard
von purrr (funktioniert mit Listen und Vektoren).
discard(v, is.na)
Der Vorteil ist, dass es einfach ist, Rohre zu verwenden. Alternativ können Sie die integrierte Teilmengenfunktion verwenden [
:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
Beachten Sie, dass na.omit
dies bei Listen nicht funktioniert:
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
Ich habe einen schnellen Benchmark durchgeführt, bei dem die beiden base
Ansätze verglichen wurden, und es stellte sich heraus, dass dies x[!is.na(x)]
schneller ist als na.omit
. Der Benutzer qwr
schlug vor, dass ich es purrr::dicard
auch versuche - dies stellte sich als massiv langsamer heraus (obwohl ich gerne Kommentare zu meiner Implementierung und meinem Test entgegennehme!)
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
Als Referenz ist hier der ursprüngliche Test von 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
für eined
aller NAs.