2016-07-26 15 views
0

Ich habe zwei Vektoren. Jeden Tag möchte ich eine Zeile hinzufügen der Datensatz eine Zeile größer zu machen:Gleitender Durchschnitt Funktion Ausgabe

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) 

Ich habe zwei Funktionen, die als kumulierter Mittelwert handeln und ein Roll bedeuten jeweils. Beide geben den Durchschnitt mit einer Verzögerung von 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))} 

Ich suche einen gleitenden Durchschnitt von 20 auf beiden Datensätze mit diesem Code zu tun:

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

Wenn ich die day1_avg laufen wirkt es wie ich würde erwarten, mit der Cumroll-Rolle, da es nur 20 Beobachtungen gegeben hat. Wenn ich jedoch tag2_avg mit 21 Beobachtungen führe, erhält jeder Wert vor der 21. Beobachtung automatisch 0 und nicht die Cumroll-Werte.

Ergebnisse sind unten mit meinem gewünschten Ausgang für 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 

ich die Funktionen irgendwie um sicherzustellen, dass ändern müssen, dass cumroll Werte in der gleichen nach dem n-ten Beobachtung der rollmean Tritte bleiben

.

Jede Hilfe würde sehr geschätzt werden!

Antwort

2

Ihre ändern 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} 

Sie erhalten:

> 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