【问题标题】:Roll apply for partial time series in R滚动申请R中的部分时间序列
【发布时间】:2015-05-17 22:09:57
【问题描述】:

给定

z <- zoo(c(1:10))

我希望能够汇总到以下内容:

> z
 4  8  10 
 10 26 19

我已经尝试使用 rollapply 进行以下操作,但无济于事:

> rollapply(zoo(c(1:10)), width = 4, FUN = "sum", by = 4, partial = TRUE, align = "right")
 1  5  9 
 1 14 30 
> rollapply(zoo(c(1:10)), width = 4, FUN = "sum", by = 4, partial = TRUE, align = "left")
 1  5  9 
10 26 19 
> rollapply(zoo(c(1:10)), width = 4, FUN = "sum", by = 4, partial = TRUE, align = "center")
 1  5  9 
 6 22 27 

任何帮助将不胜感激。第二个看起来最有希望,但我必须自定义延迟?

【问题讨论】:

    标签: r rollapply


    【解决方案1】:

    partial 参数始终适用于两端;但是,可以通过为 width 参数使用向量来分别指定每个元素的宽度,然后自己设置它的子集,而不是使用 by

    library(zoo)
    
    # inputs
    z <- zoo(1:10)
    k <- 4    
    
    n <- length(z)
    w <- rep(1:k, length = n)  # 1 2 3 4 1 2 3 4 1 2 
    ok <- w == k | seq(n) == n  # F F F T F F F T F T
    
    rollapplyr(z, w, sum)[ok]
    

    给予:

     4  8 10 
    10 26 19 
    

    2) 我们可以使用align = "left" 然后修正时间(使用上面的ok):

    r <- rollapply(z, k, by = k, sum, partial = TRUE, align = "left")
    time(r) <- time(z)[ok]
    

    3) 这可以使用aggregate.zoo 完成(使用上面的ok):

    tt <- na.locf(replace(time(z), !ok, NA), fromLast = TRUE)  # 4 4 4 4 8 8 8 8 10 10
    aggregate(z, tt, sum)
    

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 2011-09-29
      • 2016-02-29
      • 1970-01-01
      • 2020-02-02
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多