【问题标题】:How Can I us maxgap with na.fill on an zoo or xts?如何在动物园或 xts 上使用 na.fill 使用 maxgap?
【发布时间】:2019-01-16 15:16:02
【问题描述】:

我想在一个 maxgap 为 3 的 xts 中用 0 填充 NA。

library(xts)

# make sample xts with gaps
x <- zoo(1:20, Sys.Date() + 1:20) 
x[2:4] <- NA # Short run of NA's 
x[10:16] <- NA # Long run of NA's 

#This is what I want to do, but it does not work
na.fill(x, 0, maxgap=3)

maxgap 参数被忽略,所有 NA 都用 0 填充,我希望它能像 na.approx 一样工作

澄清@RLave 的问题,我想替换每个长度为 3 或更少的 NAs 系列。长度为 4 或更长的 NA 系列应保持不变。期望的行为应该与 na.approx 相同

【问题讨论】:

    标签: r xts zoo


    【解决方案1】:

    zoo 中有一个未记录且未导出的.fill_short_gaps,其使用方式如下:

    zoo:::.fill_short_gaps(x, fill = numeric(length(x)), maxgap = 3)
    

    给予:

    2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23 
             1          0          0          0          5          6          7 
    2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30 
             8          9         NA         NA         NA         NA         NA 
    2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05 
            NA         NA         17         18         19         20 
    

    【讨论】:

      【解决方案2】:

      我对 zoo 不是很熟悉,所以不能说它是否提供了一个函数或参数会为您提供开箱即用的功能。也就是说,利用na.fillix 参数,您可以编写一个简单的包装函数来提供您想要的功能。也许是这样的:

      f <- function(object, fill = 0, maxgap = Inf, ...) {
          rr <- rle(is.na(object))
          ii <- rep(rr$values == FALSE | rr$lengths > maxgap, rr$lengths)
          na.fill(object, fill, ix = ii)
      }
      
      f(x, 0, maxgap = 3)
      ## 2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23 
      ##          1          0          0          0          5          6          7 
      ## 2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30 
      ##          8          9         NA         NA         NA         NA         NA 
      ## 2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05 
      ##         NA         NA         17         18         19         20 
      

      【讨论】:

      • @RLave 正如在na.approx() 中所做的那样,OP 希望maxgap 指定将被填充的NA 值的最长连续序列。比maxgap 更长的NA 序列应该保持不变,保持不变。这有意义吗?
      【解决方案3】:

      使用 imputeTS 包有一个非常简单的方法:

      library("imputeTS")
      na_replace(x, fill = 0 , maxgap = 3)
      

      这适用于作为输入 x 的 xts 时间序列对象,以及动物园系列、向量或正常时间序列。

      【讨论】:

        猜你喜欢
        • 2018-01-21
        • 2017-02-23
        • 1970-01-01
        • 2016-06-14
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        相关资源
        最近更新 更多