从矢量中删除NA值

时间:2011-10-09 22:08:07

标签: r max min na missing-data

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

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

7 个答案:

答案 0 :(得分:232)

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

答案 1 :(得分:82)

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

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

答案 2 :(得分:17)

?max向您显示,您可以设置额外参数na.rm TRUE

除此之外,如果确实想删除NA,请使用以下内容:

myvec[!is.na(myvec)]

答案 3 :(得分:13)

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

答案 4 :(得分:12)

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

答案 5 :(得分:3)

我运行了一个比较两个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

答案 6 :(得分:0)

使用discard from purrr(适用于列表和向量)。

discard(v, is.na) 

好处是易于使用管道。或者使用内置的子设置功能[

v %>% discard(is.na)
v %>% `[`(!is.na(.))