【问题标题】:Remove NA values from a vector从向量中删除 NA 值
【发布时间】:2011-10-09 22:08:07
【问题描述】:

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

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

【问题讨论】:

    标签: r max min na missing-data


    【解决方案1】:

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

    【讨论】:

    • 这是一个非常糟糕的主意。它失败并为所有 NA 的 d 提供 -Inf。
    • @user3932000 为了让其他人明白,您的抱怨实际上是关于基本 R 函数 max() 的行为方式(例如,在执行 max(c(NA, NA) 时)。个人认为它的行为是合理的;我希望它是这样构造的,以便您在执行a &lt;- c(NA, NA); b &lt;- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE))) 之类的操作时获得预期的结果
    • @user3932000 有点切题,R 作为数据分析平台的众多优势之一是其对缺失数据的复杂处理,这是其作者大量仔细考虑的结果. (如果您对该主题感兴趣,see here 可以很好地讨论所涉及的一些问题,从从事将类似 R 的 NA 处理设施合并到 Python 的优秀 NumPy 包。)
    • @user3932000:这个答案真的很糟糕吗?你认为空集的最大值是多少?
    • @CliffAB 它没有最大值。您可以将最大值指定为 -∞(将最小值指定为 +∞),但这并不总是理想的或直观的。此外,当您从 NAs 的向量中删除所有 NAs 时,您会期望一个空向量,而不是 -∞。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        ?max 显示有一个额外的参数na.rm 可以设置为TRUE。

        除此之外,如果您真的想要删除NAs,只需使用类似的东西:

        myvec[!is.na(myvec)]
        

        【讨论】:

        • 我认为这是最好的。 na.rm 和 na.omit 在输出中添加了相当多的垃圾。
        • 除了na.omit也有dataframe方法,所以比较通用。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我运行了一个快速基准测试,比较了两种base 方法,结果发现x[!is.na(x)] 比na.omit 快。用户qwr 建议我也尝试purrr::dicard - 结果证明速度非常慢(尽管我很乐意在我的实现和测试中使用 cmets!)

            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
            

            【讨论】:

            • 你应该试试purrr:discard
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-30
            • 1970-01-01
            • 1970-01-01
            • 2023-01-17
            • 1970-01-01
            相关资源
            最近更新 更多