2013-04-19 12 views
5

Ich versuche Rolling-Mittel eines unsymmetrischen Datensatzes zu berechnen. Um zu zeigen, meinen Punkt Ich habe dieses Spielzeug Beispiel meiner Daten erzeugt:Erzeugen eines rollenden Durchschnitts aller vorherigen Beobachtungen pro ID in einem unsymmetrischen Paneldatensatz

ID year Var RollingAvg(Var) 
1 2000 2  NA 
1 2001 3  2 
1 2002 4  2.5 
1 2003 2  3 
2 2001 2  NA 
2 2002 5  2 
2 2003 4  3.5 

Die Säule RollingAvg(Var) ist, was ich will, kann aber nicht bekommen. In Worten suche ich nach dem rollenden Durchschnitt aller früheren Beobachtungen von Var für jeden ID. Ich habe versucht, rollapply und ddply in der zoo und die plyr-Paket zu verwenden, aber ich kann nicht sehen, wie die Länge des Rollfensters alle vorherigen Beobachtungen für jede ID zu verwenden. Vielleicht sollte ich stattdessen das plm-Paket verwenden? Jede Hilfe wird geschätzt.

Ich habe andere Beiträge auf Rolling auf BALANCED-Panel-Daten gesehen, aber ich kann nicht ihre Antworten auf unausgewogene Daten extrapolieren.

Danke,

M

+0

ich nicht Versteh warum ist die 5. Reihe von 'RollingAvg (Var)' 'NA'? –

+0

Ich denke, es ist Computing für jede 'ID' – Metrics

+0

Ist Ihre erwartete Ausgabe korrekt? – Metrics

Antwort

7

Mit data.table:

library(data.table) 
d = data.table(your_df) 

d[, RollingAvg := {avg = cumsum(Var)/seq_len(.N); 
        c(NA, avg[-length(avg)])}, 
    by = ID] 

(oder sogar vereinfacht)

d[, RollingAvg := c(NA, head(cumsum(Var)/(seq_len(.N)), -1)), by = ID] 
+2

sollten Sie niemals 'DT $ x = ...' mit 'data.table' verwenden, das kopiert die ganze Tabelle, was genau das ist, was sie nicht versucht. Verwenden Sie ': =' stattdessen (lesen Sie die Vignette) – statquant

+0

fair genug, behoben – eddi

+0

@eddi: Danke, das funktioniert! Versuche immer noch zu verstehen, was vor sich geht, aber ich werde wahrscheinlich dorthin kommen :) Ist es möglich, deine Antwort so zu erweitern, dass die ersten 2 Beobachtungen als'NA'-Codierung anstatt nur als erste kodiert werden? (Ich weiß, dass es nicht in der ursprünglichen Frage ist) – Mace

2

Unter der Annahme, dass Jahre innerhalb jeder ID angrenzen (der Fall ist, in die Beispieldaten) und DF ist der Eingabedatenrahmen, er re eine Lösung Basis mit nur R. cumRoll eine Funktion ist, die auf einer ID die erforderliche Operation durchführt und ave führt dann durch ID:

cumRoll <- function(x) c(NA, head(cumsum(x)/seq_along(x), -1)) 
DF$Roll <- ave(DF$Var, DF$ID, FUN = cumRoll) 

Das Ergebnis ist:

> DF 
    ID year Var Roll 
1 1 2000 2 NA 
2 1 2001 3 2.0 
3 1 2002 4 2.5 
4 1 2003 2 3.0 
5 2 2001 2 NA 
6 2 2002 5 2.0 
7 2 2003 4 3.5