2016-07-26 25 views
0

私は2つのベクトルを持っています。私は、データセットが1行大きくする行を追加したい毎日:移動平均関数の問題

day1 <- c(0,0,8,10,4,5,3,5,6,10,7,11,9,7,10,13,8,7,5,4) 
day2 <- c(0,0,8,10,4,5,3,5,6,10,7,11,9,7,10,13,8,7,5,4,0) 

私は、累積平均とローリングとして動作する二つの機能を持っているが、それぞれ意味します。

day1_avg <- ave(day1, FUN = function(x) rollmean(x, 20)) 
day2_avg <- ave(day2, FUN = function(x) rollmean(x, 20)) 

私はそれが私として機能day1_avgを実行すると:どちらも、私はこのコードを使用して、両方のデータセットに20のローリング平均を行うために探しています。1.

cumroll <- function(x) { 
    if(length(x)<=1) {x} 
    else { 
     x <- head(x, -1) 
     c(head(x,1), cumsum(x)/seq_along(x)) 
    } 
} 

rollmean <- function(x, n) {if (length(x) <= n) cumroll(x) else rollapply(x,list(-seq(n)), mean, fill = cumroll(x))} 

の遅れとの平均値を与えますクメンロールは20回しか観測されていないため、演技を演じると期待されます。しかし、私がday2_avgを21の観測値で実行した場合、21回目の観測前のすべての値は、累積値ではなく0が自動的に与えられます。

結果がday2_avgのための私の所望の出力を以下のとおりです。

day2  day1_avg  day2_avg DESIRED 
0  0   0   0 
0  0   0   0 
8  0   0   0 
10  2.666667  0   2.666667 
4  4.5   0   4.5 
5  4.4   0   4.4 
3  4.5   0   4.5 
5  4.285714  0   4.285714 
6  4.375  0   4.375 
10  4.555556  0   4.555556 
7  5.1   0   5.1 
11  5.272727  0   5.272727 
9  5.75   0   5.75 
7  6   0   6 
10  6.071429  0   6.071429 
13  6.333333  0   6.333333 
8  6.75   0   6.75 
7  6.823529  0   6.823529 
5  6.833333  0   6.833333 
4  6.736842  0   6.736842 
0      6.6   6.6 

私はcumroll値は中rollmeanキックのn番目の観測後も同じままであることを確認するために何らかの形で機能を修正する必要が

どんな助力も大変感謝しています!

答えて

2
は変更

あなたrollmean

rollmean <- function(x, n) {if (length(x) <= n) tmp<- cumroll(x) 
else {tmp<-rollapply(x,list(-seq(n)), mean, fill = cumroll(x)) 
tmp[1:n]<-cumroll(x[1:n]) 
} 
tmp} 

あなたが取得します:

> tail(cbind(day1,day1_avg,day2,day2_avg)) 
     day1 day1_avg day2 day2_avg 
[17,] 8 6.750000 8 6.750000 
[18,] 7 6.823529 7 6.823529 
[19,] 5 6.833333 5 6.833333 
[20,] 4 6.736842 4 6.736842 
[21,] 0 0.000000 0 6.600000 
[22,] 0 0.000000 1 6.600000