2025-01-17 08:00:01

从向量中移除NA值

我有一个巨大的向量,它有两个NA值,我试图找到这个向量的最大值(向量都是数字),但我不能这样做,因为NA值。

我如何删除NA值,以便我可以计算最大?


当前回答

另一个选项使用complete。这样的案例:

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创建

其他回答

max表示有一个额外的参数na。rm,你可以设置为TRUE。

除此之外,如果你真的想要删除NAs,只需使用如下方法:

myvec[!is.na(myvec)]

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

以防刚接触R的人想要原始问题的简化答案

如何从一个向量中移除NA值?

下面就是:

假设你有一个向量foo,如下所示:

foo = c(1:10, NA, 20:30)

运行长度(foo)给出22。

nona_foo = foo[!is.na(foo)]

length(nona_foo)为21,因为NA值已被删除。

记住is.na(foo)返回一个布尔矩阵,所以用这个值的相反值为foo索引将会给出所有非NA的元素。

我运行了一个比较两种基本方法的快速基准测试,结果表明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

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