Respostas:
Tentando ?max
, você verá que ele realmente tem um na.rm =
argumento, definido por padrão como FALSE
. (Esse é o padrão comum para muitas outras funções R incluindo sum()
, mean()
etc.)
A configuração na.rm=TRUE
faz exatamente o que você está pedindo:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
Se você deseja remover todos os NA
s, use este idioma:
d <- d[!is.na(d)]
Uma nota final: Outras funções (por exemplo table()
, lm()
e sort()
) tem NA
argumentos relacionados com que usam nomes diferentes (e oferecem diferentes opções). Portanto, se NA
você causar problemas em uma chamada de função, vale a pena procurar uma solução interna entre os argumentos da função. Eu descobri que geralmente há um já lá.
max()
se comporta (como, por exemplo, ao fazer max(c(NA, NA)
). Pessoalmente, acho que seu comportamento é razoável; Espero que ele foi construído dessa maneira para que você obtenha o resultado esperado quando fazendo coisas comoa <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NA
instalações de manipulação do tipo R no excelente pacote NumPy do Python .)
NA
s de um vetor de NA
s, esperaria um vetor vazio, não -∞.
?max
mostra que há um parâmetro extra na.rm
que você pode definir TRUE
.
Além disso, se você realmente deseja remover os NA
s, use algo como:
myvec[!is.na(myvec)]
na.omit
também tem um método de quadro de dados, por isso é mais geral.
Você pode ligar max(vector, na.rm = TRUE)
. De maneira mais geral, você pode usar a na.omit()
função
Apenas no caso de alguém novo em R querer uma resposta simplificada para a pergunta original
Como posso remover valores de NA de um vetor?
Aqui está:
Suponha que você tenha um vetor da foo
seguinte maneira:
foo = c(1:10, NA, 20:30)
correr length(foo)
dá 22.
nona_foo = foo[!is.na(foo)]
length(nona_foo)
é 21, porque os valores de NA foram removidos.
Remember is.na(foo)
retorna uma matriz booleana; portanto, a indexação foo
com o oposto desse valor fornecerá todos os elementos que não são NA.
Use discard
from purrr (funciona com listas e vetores).
discard(v, is.na)
O benefício é que é fácil usar canos; alternativamente, use a função de subconjunto integrada [
:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
Observe que na.omit
não funciona em listas:
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
Fiz um rápido benchmark comparando as duas base
abordagens e, x[!is.na(x)]
mais rápido do que na.omit
. O usuário qwr
sugeriu que eu tentasse purrr::dicard
também - isso acabou sendo muito mais lento (embora eu tenha prazer em fazer comentários sobre minha implementação e teste!)
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
Para referência, aqui está o teste original de 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
parad
todas as NAs.