2013-04-19 6 views
5

Sto provando a calcolare i mezzi a rotazione di un set di dati sbilanciati. Per illustrare il mio punto ho prodotto questo esempio giocattolo dei miei dati:Produzione di una media mobile di TUTTE le osservazioni precedenti per ID in un dataset di pannello sbilanciato

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 

La colonna RollingAvg(Var) è quello che voglio, ma non può ottenere. A parole, sto cercando la media mobile di TUTTE le precedenti osservazioni di Var per ogni ID. Ho provato a utilizzare rollapply e ddply nel pacchetto zoo e nel pacchetto plyr, ma non riesco a vedere come impostare la lunghezza della finestra mobile per utilizzare TUTTE le osservazioni precedenti per ciascun ID. Forse dovrei usare il pacchetto plm, invece? Qualsiasi aiuto è apprezzato.

Ho visto altri post sui mezzi a rotazione sul set di dati del pannello BALANCED, ma non riesco a estrapolare le loro risposte a dati sbilanciati.

Grazie,

M

+0

io no capire perché la quinta riga di 'RollingAvg (Var)' 'NA'? –

+0

Penso che stia calcolando per ogni 'ID' – Metrics

+0

L'uscita prevista è corretta? – Metrics

risposta

7

Uso 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] 

(o anche semplificato)

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

non dovresti mai usare 'DT $ x = ...' con 'data.table' questo copia l'intera tabella, che è esattamente ciò che cerca di non fare. Usa ': =' invece (leggi la vignetta) – statquant

+0

abbastanza giusto, corretto – eddi

+0

@eddi: Grazie, funziona! Sto ancora cercando di capire cosa sta succedendo, ma probabilmente ci arriverò :) È possibile estendere la tua risposta in modo tale che il primo dica 2 osservazioni ottenute con codice "NA "invece del solo primo? (So ​​che non è nella domanda originale) – Mace

2

Supponendo che anni sono contigui all'interno di ciascun ID (che è caso i dati di esempio) e DF è il frame di dati di input, lui re è una soluzione che utilizza solo basare R. cumRoll è una funzione che esegue l'operazione richiesta su un ID e ave quindi esegue facendo ID:

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

Il risultato è:

> 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