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?

Author: Mus, 2011-10-09

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.

 274
Author: Josh O'Brien,
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
 96
Author: IRTFM,
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)]
 21
Author: Nick Sabbe,
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
 18
Author: qwr,
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().

 16
Author: Michael Hoffman,
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,

 16
Author: Scott C Wilson,
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
 3
Author: jsavn,
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