Usuń wartości NA z wektora
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ć max?
7 answers
Próbując ?max
, zobaczysz, że w rzeczywistości ma on argument na.rm =
, domyślnie ustawiony na FALSE
. (Jest to typowa wartość domyślna dla wielu innych funkcji R, w tym sum()
, mean()
, itd.)
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
s, użyj tego idiomu:
d <- d[!is.na(d)]
Ostatnia Uwaga: inne funkcje (np. table()
, lm()
, and sort()
) have NA
-related arguments that use different names (and offer different opcje). Więc jeśli NA
powoduje problemy w wywołaniu funkcji, warto sprawdzić wbudowane rozwiązanie wśród argumentów funkcji. Znalazłem tam zazwyczaj jeden już tam jest.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 23:56:03
Funkcja na.omit
jest tym, czego wiele procedur regresji używa wewnętrznie:
vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 22:27:03
?max
pokazuje, że istnieje dodatkowy parametr na.rm
, który można ustawić na TRUE
.
Poza tym, Jeśli naprawdę chcesz usunąć NA
s, po prostu użyj czegoś w stylu:
myvec[!is.na(myvec)]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 22:22:45
Użycie discard
from purrr (Działa z listami i wektorami).
discard(v, is.na)
Zaletą jest to, że jest łatwy w użyciu; alternatywnie użyj wbudowanej funkcji podzbiorów [
:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
Zauważ, że na.omit
nie działa na listach:
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-16 21:55:12
Możesz zadzwonić max(vector, na.rm = TRUE)
. Bardziej ogólnie można użyć funkcji na.omit()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 22:22:21
Na wypadek, gdyby ktoś nowy w R chciał uproszczonej odpowiedzi na pierwotne pytanie
Jak usunąć wartości NA z wektora?
Oto jest:
Załóżmy, że masz wektor foo
w następujący sposób:
foo = c(1:10, NA, 20:30)
Bieganie length(foo)
daje 22.
nona_foo = foo[!is.na(foo)]
length(nona_foo)
jest 21, ponieważ wartości NA zostały usunięte.
Pamiętaj is.na(foo)
zwraca macierz boolowską, więc indeksowanie {[2] } z odwrotnością tej wartości da Ci wszystkie elementy, które nie są NA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-17 16:49:48
Przeprowadziłem szybki benchmark porównując dwa podejścia base
i okazało się, że x[!is.na(x)]
jest szybszy niż na.omit
. User qwr
zasugerował mi również wypróbowanie purrr::dicard
- okazało się, że jest to znacznie wolniejsze (choć chętnie przyjmę komentarze na temat mojej implementacji i testu!)
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
Dla odniesienia, oto oryginalny test 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-17 12:54:52