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!