我有一个巨大的向量,它有两个NA值,我试图找到这个向量的最大值(向量都是数字),但我不能这样做,因为NA值。
我如何删除NA值,以便我可以计算最大?
我有一个巨大的向量,它有两个NA值,我试图找到这个向量的最大值(向量都是数字),但我不能这样做,因为NA值。
我如何删除NA值,以便我可以计算最大?
当前回答
na。省略函数是很多回归例程内部使用的:
vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
其他回答
我运行了一个比较两种基本方法的快速基准测试,结果表明x[!is.na(x)]比na.略去更快。用户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)] vs na. ignore的原始测试:
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
na。省略函数是很多回归例程内部使用的:
vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
使用purrr中的discard(用于列表和向量)。
discard(v, is.na)
好处是很容易使用管道;或者使用内置的子设置函数[:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
注意na。省略对列表无效:
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
max表示有一个额外的参数na。rm,你可以设置为TRUE。
除此之外,如果你真的想要删除NAs,只需使用如下方法:
myvec[!is.na(myvec)]
尝试吗,max,你会看到它实际上有一个na。rm = argument,默认为FALSE。(这是许多其他R函数的默认值,包括sum(), mean()等)
设置na。rm=TRUE只做你想要的:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
如果您确实想删除所有的NAs,请使用以下习语:
d <- d[!is.na(d)]
最后注意:其他函数(例如table()、lm()和sort())具有与na相关的参数,它们使用不同的名称(并提供不同的选项)。因此,如果NA在函数调用中导致了问题,那么值得在函数的参数中检查内置解决方案。我发现那里通常已经有一个了。