提问人:CodeGuy 提问时间:10/10/2011 最后编辑:M--CodeGuy 更新时间:10/24/2023 访问量:604856
从向量中删除 NA 值
Remove NA values from a vector
答:
尝试 ,您会看到它实际上有一个参数,默认设置为 。(这是许多其他 R 函数的常见默认值,包括 、 等)?max
na.rm =
FALSE
sum()
mean()
设置正是您所要求的:na.rm=TRUE
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
如果您确实想删除所有 s,请改用以下习语:NA
d <- d[!is.na(d)]
最后一点:其他函数(例如 、 和 )具有与 相关的参数,这些参数使用不同的名称(并提供不同的选项)。因此,如果 在函数调用中导致问题,则值得在函数的参数中检查内置解决方案。我发现通常已经有一个了。table()
lm()
sort()
NA
NA
评论
-Inf
d
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
max(NULL)
-Inf
您可以调用 .更一般地说,您可以使用该函数。max(vector, na.rm = TRUE)
na.omit()
?max
显示有一个额外的参数可以设置为 。na.rm
TRUE
除此之外,如果您真的想删除 s,只需使用如下内容:NA
myvec[!is.na(myvec)]
评论
na.omit
该函数是许多回归例程在内部使用的函数:na.omit
vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
以防万一刚接触 R 的人想要对原始问题给出简化的答案
如何从向量中删除 NA 值?
在这里:
假设您有一个向量,如下所示:foo
foo = c(1:10, NA, 20:30)
跑步给 22。length(foo)
nona_foo = foo[!is.na(foo)]
length(nona_foo)
为 21,因为 NA 值已被删除。
请记住返回一个布尔矩阵,因此与此值相反的索引将为您提供所有非 NA 的元素。is.na(foo)
foo
使用 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
我运行了一个比较这两种方法的快速基准测试,结果证明它比 .用户建议我也尝试一下 - 结果证明这要慢得多(尽管我很乐意对我的实现和测试发表评论!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
作为参考,以下是 vs 的原始测试: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
评论
purrr:discard
另一个选项使用如下: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 with reprex v2.0.2
评论