2016-07-26 93 views
0

我有兩個向量。每天我想添加一行,使數據集一行更大:移動平均函數問題

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) 

我有兩個函數分別充當累計平均值和滾動平均值。這兩個給出平均用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對兩個數據集的滾動平均值滯後:

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

當我運行day1_avg它作爲我由於只有20個觀察結果,因此可以期望,由於累計行動。但是,當我用21個觀測值運行day2_avg時,第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