Mam ogromny wektor, który ma kilka NA
wartości, i próbuję znaleźć maksymalną wartość w tym wektorze (wektor to wszystkie liczby), ale nie mogę tego zrobić z powodu NA
wartości.
Jak mogę usunąć NA
wartości, aby móc obliczyć maksimum?
Próbując ?max
, zobaczysz, że faktycznie ma na.rm =
argument, domyślnie ustawiony na FALSE
. (To wspólna domyślna dla wielu innych funkcji, w tym R sum()
, mean()
etc.)
Ustawienie na.rm=TRUE
robi dokładnie to, o co prosisz:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
Jeśli chcesz usunąć wszystkie NA
, użyj zamiast tego tego idiomu:
d <- d[!is.na(d)]
Ostatnia uwaga: Inne funkcje (np table()
, lm()
i sort()
) mają NA
związane z modelem argumenty, które używają różnych nazw (oraz oferują różne opcje). Więc jeśli NA
powodują problemy w wywołaniu funkcji, warto sprawdzić wbudowane rozwiązanie wśród argumentów funkcji. Odkryłem, że zwykle jest już jeden.
-Inf
jednąd
ze wszystkich NA.max()
zachowuje się podstawowa funkcja R (jak na przykład podczas działaniamax(c(NA, NA)
). Osobiście uważam, że jego zachowanie jest rozsądne; Spodziewam się, że został skonstruowany w ten sposób, aby uzyskać oczekiwany rezultat podczas robienia takich rzeczya <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NA
w doskonałym pakiecie NumPy Pythona .)NA
s z wektoraNA
s, możesz spodziewać się pustego wektora, a nie -∞.Ta
na.omit
funkcja jest używana wewnętrznie przez wiele procedur regresji:źródło
?max
pokazuje, że istnieje dodatkowy parametrna.rm
, który można ustawićTRUE
.Poza tym, jeśli naprawdę chcesz usunąć
NA
s, po prostu użyj czegoś takiego:źródło
na.omit
ma również metodę ramki danych, więc jest bardziej ogólna.Można zadzwonić
max(vector, na.rm = TRUE)
. Mówiąc bardziej ogólnie, możesz użyć tejna.omit()
funkcji.źródło
Na wypadek, gdyby ktoś nowy w R chciał uproszczonej odpowiedzi na pierwotne pytanie
Oto on:
Załóżmy, że masz wektor
foo
w następujący sposób:bieganie
length(foo)
daje 22.length(nona_foo)
wynosi 21, ponieważ wartości NA zostały usunięte.Pamiętaj, że
is.na(foo)
zwraca macierz boolowską, więc indeksowaniefoo
odwrotnością tej wartości da ci wszystkie elementy, które nie są NA.źródło
Użyj
discard
od mruczenia (działa z listami i wektorami).Zaletą jest to, że rury są łatwe w użyciu; alternatywnie użyj wbudowanej funkcji podziału
[
:Pamiętaj, że
na.omit
nie działa na listach:źródło
Przeprowadziłem szybki test porównawczy, porównując oba
base
podejścia i okazało się, żex[!is.na(x)]
jest szybszy niżna.omit
. Użytkownikqwr
zasugerował, że spróbujępurrr::dicard
również - okazało się to znacznie wolniejsze (choć chętnie przyjmę komentarze dotyczące mojej implementacji i testów!)Dla porównania, oto oryginalny test
x[!is.na(x)]
vsna.omit
:źródło
purrr:discard