2015-05-17 6 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) 
Смежные вопросы