R语言 从向量中删除NA值

w6mmgewl  于 2023-10-13  发布在  其他
关注(0)|答案(8)|浏览(145)

我有一个巨大的向量,它有几个NA值,我试图找到这个向量中的最大值(向量都是数字),但我不能这样做,因为NA值。
如何删除NA值以便计算max?

h9a6wy2h

h9a6wy2h1#

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

1rhkuytd

1rhkuytd2#

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

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

l7mqbcuq3#

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

yv5phkfx4#

?max向您展示了一个额外的参数na.rm,您可以将其设置为TRUE
除此之外,如果你真的想删除NA s,只需使用如下代码:

myvec[!is.na(myvec)]
sdnqo3pr

sdnqo3pr5#

只是为了以防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的元素。

b91juud3

b91juud36#

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

wfveoks0

wfveoks07#

我运行了一个快速基准测试,比较了两种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
gdx19jrr

gdx19jrr8#

另一个使用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

相关问题