我有一个巨大的向量,其中有几个
NA
值,我试图找到该向量中的最大值(向量都是数字),但我不能这样做,因为 NA
价值观。
如何删除
NA
值以便计算最大值?
尝试
?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
导致函数调用出现问题,则值得在函数参数中检查内置解决方案。我发现那里已经有通常了。
na.omit
函数是许多回归例程内部使用的函数:
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.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
。
除此之外,如果您真的想要删除
NA
,只需使用类似以下内容:
myvec[!is.na(myvec)]
以防 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
- 结果发现速度慢得多(尽管我很乐意对我的实现和测试发表评论!)
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
使用
complete.cases
的另一个选项如下:
d <- c(1, 100, NA, 10)
result <- complete.cases(d)
output <- d[result]
output
#> [1] 1 100 10
max(output)
#> [1] 100
创建于 2022-08-26,使用 reprex v2.0.2