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.
-Inf
für eined
aller NAs.max()
verhält (wie zum Beispiel, wenn Sie dies tunmax(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 vonNA
s entfernen , erwarten Sie einen leeren Vektor, nicht -∞.Die
na.omit
Funktion wird von vielen Regressionsroutinen intern verwendet:quelle
?max
zeigt Ihnen, dass es einen zusätzlichen Parameter gibtna.rm
, den Sie einstellen könnenTRUE
.Abgesehen davon, wenn Sie das s wirklich entfernen möchten
NA
, verwenden Sie einfach etwas wie:quelle
na.omit
hat auch eine Datenrahmenmethode, ist also allgemeiner.Sie können anrufen
max(vector, na.rm = TRUE)
. Im Allgemeinen können Sie diena.omit()
Funktion verwenden.quelle
Nur für den Fall, dass jemand, der neu bei R ist, eine vereinfachte Antwort auf die ursprüngliche Frage wünscht
Hier ist es:
Angenommen, Sie haben einen Vektor
foo
wie folgt:Laufen
length(foo)
gibt 22.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 alsofoo
mit dem Gegenteil dieses Werts indizieren , erhalten Sie alle Elemente, die nicht NA sind.quelle
Verwendung
discard
von purrr (funktioniert mit Listen und Vektoren).Der Vorteil ist, dass es einfach ist, Rohre zu verwenden. Alternativ können Sie die integrierte Teilmengenfunktion verwenden
[
:Beachten Sie, dass
na.omit
dies bei Listen nicht funktioniert:quelle
Ich habe einen schnellen Benchmark durchgeführt, bei dem die beiden
base
Ansätze verglichen wurden, und es stellte sich heraus, dass diesx[!is.na(x)]
schneller ist alsna.omit
. Der Benutzerqwr
schlug vor, dass ich espurrr::dicard
auch versuche - dies stellte sich als massiv langsamer heraus (obwohl ich gerne Kommentare zu meiner Implementierung und meinem Test entgegennehme!)Als Referenz ist hier der ursprüngliche Test von
x[!is.na(x)]
vsna.omit
:quelle
purrr:discard