从向量中删除 NA 值

问题描述 投票:0回答:8

我有一个巨大的向量,其中有几个

NA
值,我试图找到该向量中的最大值(向量都是数字),但我不能这样做,因为
NA
价值观。

如何删除

NA
值以便计算最大值?

r na r-faq
8个回答
316
投票

尝试

?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
导致函数调用出现问题,则值得在函数参数中检查内置解决方案。我发现那里已经有通常了。


113
投票

na.omit
函数是许多回归例程内部使用的函数:

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000

47
投票

使用 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

27
投票

?max
显示有一个额外参数
na.rm
,您可以将其设置为
TRUE

除此之外,如果您真的想要删除

NA
,只需使用类似以下内容:

myvec[!is.na(myvec)]

19
投票

以防 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 的元素。


16
投票

您可以致电

max(vector, na.rm = TRUE)
。更一般地,您可以使用
na.omit()
函数。


6
投票

我运行了一个快速基准测试,比较了两种

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

1
投票

使用

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

© www.soinside.com 2019 - 2024. All rights reserved.