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