我有一个巨大的向量,有几个NA
值,我试图找到该向量中的最大值(向量是所有数字),但我不能这样做因为NA
值。
如何删除NA
值以便我可以计算最大值?
答案 0 :(得分:232)
尝试?max
,您会看到它实际上有一个na.rm =
参数,默认设置为FALSE
。 (这是许多其他R函数的常见默认值,包括sum()
,mean()
等。
设置na.rm=TRUE
可以满足您的要求:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
如果您确实要删除所有NA
,请改用此习语:
d <- d[!is.na(d)]
最后一点:其他功能(例如table()
,lm()
和sort()
)具有NA
- 使用不同名称的相关参数(并提供不同的选项)。因此,如果NA
导致函数调用出现问题,则值得检查函数参数中的内置解决方案。我发现通常已存在。
答案 1 :(得分:82)
na.omit
函数是很多回归例程在内部使用的函数:
vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
答案 2 :(得分:17)
?max
向您显示,您可以设置额外参数na.rm
TRUE
。
除此之外,如果确实想删除NA
,请使用以下内容:
myvec[!is.na(myvec)]
答案 3 :(得分:13)
您可以致电max(vector, na.rm = TRUE)
。更一般地说,您可以使用na.omit()
函数。
答案 4 :(得分:12)
以防万一R新手想要简化原始问题的答案
如何从矢量中删除NA值?
这是:
假设您有一个向量foo
,如下所示:
foo = c(1:10, NA, 20:30)
运行length(foo)
得到22.
nona_foo = foo[!is.na(foo)]
length(nona_foo)
为21,因为NA值已被删除。
记住is.na(foo)
返回一个布尔矩阵,因此使用与此值相反的索引foo
将为您提供所有非NA的元素。
答案 5 :(得分:3)
我运行了一个比较两个base
方法的快速基准测试,结果发现x[!is.na(x)]
比na.omit
快。用户qwr
建议我也尝试purrr::dicard
-事实证明,这要慢得多(尽管我会很乐意对实现和测试发表评论!)
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
作为参考,这是x[!is.na(x)]
与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
答案 6 :(得分:0)
使用discard
from purrr(适用于列表和向量)。
discard(v, is.na)
好处是易于使用管道。或者使用内置的子设置功能[
:
v %>% discard(is.na)
v %>% `[`(!is.na(.))