【发布时间】:2011-10-09 22:08:07
【问题描述】:
我有一个巨大的向量,其中有几个 NA 值,我试图在该向量中找到最大值(向量都是数字),但我不能这样做,因为 @ 987654322@ 值。
如何删除 NA 值以便计算最大值?
【问题讨论】:
标签: r max min na missing-data
我有一个巨大的向量,其中有几个 NA 值,我试图在该向量中找到最大值(向量都是数字),但我不能这样做,因为 @ 987654322@ 值。
如何删除 NA 值以便计算最大值?
【问题讨论】:
标签: r max min na missing-data
尝试?max,您会发现它实际上有一个na.rm = 参数,默认设置为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 导致您在函数调用中出现问题,则值得检查函数参数中的内置解决方案。我发现通常已经有一个了。
【讨论】:
d 提供 -Inf。
max() 的行为方式(例如,在执行 max(c(NA, NA) 时)。个人认为它的行为是合理的;我希望它是这样构造的,以便您在执行a <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE))) 之类的操作时获得预期的结果
NA 处理设施合并到 Python 的优秀 NumPy 包。)
NAs 的向量中删除所有 NAs 时,您会期望一个空向量,而不是 -∞。
na.omit 函数是许多回归例程在内部使用的:
vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
【讨论】:
使用discard from purrr(适用于列表和向量)。
discard(v, is.na)
好处是管道易于使用;或者使用内置的子集函数[:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
请注意,na.omit 不适用于列表:
> 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)]
【讨论】:
na.omit也有dataframe方法,所以比较通用。
以防万一 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 的元素。
【讨论】:
您可以拨打max(vector, na.rm = TRUE)。更一般地,您可以使用na.omit() 函数。
【讨论】:
我运行了一个快速基准测试,比较了两种base 方法,结果发现x[!is.na(x)] 比na.omit 快。用户qwr 建议我也尝试purrr::dicard - 结果证明速度非常慢(尽管我很乐意在我的实现和测试中使用 cmets!)
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.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