2015-05-17 21 views
3

鉴于卷申请部分时间序列R中

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

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)