在R中对部分时间序列进行滚动应用

3

给定

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 

任何帮助都将不胜感激。第二个选项似乎最有前途,但我需要自定义一个滞后期?
1个回答

1

partial参数始终适用于两端;但是,可以通过使用width参数的向量并自行进行子集选择来单独为每个元素指定宽度:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接