ベクトルの一定範囲に関数を適用しながら逐次計算していく(ローリング処理)

ある一定期間のリスク・リターン計算をする時など、
ベクトルの一定範囲に関数を適用しながら逐次計算していく処理(ローリング処理)をすることが多いので、関数にしておく。

apply.roll <- function(x,size.window,func){
  result <- numeric(length(x) - size.window +1)
  for(index.end in size.window:length(x)){
    index.start <- (1 + index.end) - size.window
    result[index.start] <- func(x[index.start:index.end])
  }
  return(result)
}

使い方は

#1〜10まで幅3のwindowを適用して和を返す。具体的には123の和,234の和,345の和,etcを返す。
>apply.roll(1:10,3,sum)
[1]  6  9 12 15 18 21 24 27

みたいな感じ。

CRANにあるzooパッケージには元々関数が用意されているので、それを使ってもいい。
使ってもいいけど、いちいち型変換するのがすこしめんどくだい。

library(zoo)
> rollapply(zoo(1:10),3,sum)
 2  3  4  5  6  7  8  9 
 6  9 12 15 18 21 24 27 
> as.numeric(rollapply(zoo(1:10),3,sum))
[1]  6  9 12 15 18 21 24 27