215

我有一个巨大的向量,它有几个值,我试图在该向量中找到最大值(向量都是数字),但由于这些值NA我不能这样做。NA

如何删除这些NA值以便计算最大值?

4

7 回答 7

295

尝试?max一下,你会发现它实际上有一个na.rm =参数,默认设置为FALSE. (这是许多其他 R 函数的常见默认值,包括sum()mean()等)

设置na.rm=TRUE正是您所要求的:

d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)

如果您确实想删除所有NAs,请改用以下成语:

d <- d[!is.na(d)]

最后一点:其他函数(例如table()lm()sort())具有NA使用不同名称(并提供不同选项)的相关参数。因此,如果NA' 导致您在函数调用中出现问题,则值得检查函数参数中的内置解决方案。我发现那里通常已经有一个了。

于 2011-10-09T22:21:48.687 回答
104

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

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
于 2011-10-09T22:27:03.090 回答
33

使用discardfrom 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
于 2019-07-26T17:55:03.337 回答
23

?maxna.rm显示您可以设置一个额外的参数TRUE

除此之外,如果您真的想删除NAs,只需使用以下内容:

myvec[!is.na(myvec)]
于 2011-10-09T22:22:45.080 回答
17

以防万一 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)索引将为您提供所有不是 NA 的元素。foo

于 2015-01-17T16:49:48.897 回答
16

你可以打电话max(vector, na.rm = TRUE)。更一般地,您可以使用该na.omit()功能。

于 2011-10-09T22:22:21.917 回答
5

我运行了一个比较这两种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)]vs的原始测试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
于 2020-03-09T10:41:22.537 回答