2012-03-10 19 views
10

Sono un principiante R e sto avendo molti problemi a fare qualcosa che è probabilmente molto semplice. Dispongo di un grande set di dati suddiviso in gruppi in base al codice paese e desidero prendere una media mobile di 3 mesi dell'indice dei prezzi per paese, quindi inserirla in una nuova colonna corrispondente al mese appropriato. Ho cercato di usare rollmean come questo senza successo (messaggi in codice e di errore di seguito):applicando la media mobile per gruppo in R

> leader$last3<-tapply(leader, leader$ccode, 
    function(x) rollmean(leader$GI_delta, 3, na.pad=T)) 
Error in tapply(leader, leader$ccode, function(x) rollmean(leader$GI_delta, : 
    arguments must have same length 

> leader$last3<-ddply(leader, .(ccode), 
    rollmean(GI_delta, 3, na.pad=T)) 

Error in llply(.data = .data, .fun = .fun, ..., .progress = .progress, : 
    .fun is not a function. 

Qualsiasi aiuto sarebbe molto apprezzato!

risposta

5

Al primo tentativo, la funzione non utilizza l'argomento x, e restituisce sempre la stessa cosa (un vettore con la dimensione errata). Inoltre, il primo argomento dovrebbe essere un vettore. Infine, tapply restituisce un elenco di vettori: non è possibile inserire il risultato direttamente in un data.frame.

library(zoo) 
n <- 10 
leader <- data.frame(
    ccode = rep(LETTERS[1:3],each=n), 
    GI_delta = rnorm(3*n) 
) 
tapply(
    leader$GI_delta, 
    leader$ccode, 
    function(x) rollmean(x, 3, na.pad=TRUE) 
) 

Nel secondo esempio, il terzo argomento di plyr dovrebbe essere una funzione, non un'espressione. Se si desidera utilizzare un'espressione, è possibile utilizzare summarize o transform in funzione (summarize restituisce un data.frame 1 fila per ogni valore di ccode, mentre transform mantiene il numero di righe invariato), e mettere le espressioni come ulteriori argomenti.

library(plyr) 
ddply(
    leader, "ccode", 
    transform, 
    last3 = rollmean(GI_delta, 3, align="right", na.pad=TRUE) 
) 
+0

Grazie per il vostro aiuto Vincent! –

13

Se si desidera creare una nuova colonna, provare a utilizzare ave. Assomiglia a tapply ma restituisce un vettore della stessa lunghezza del suo primo argomento. La mia esperienza è che è molto più veloce di ddply:

require(zoo) 
leader$last3<-ave(leader$GI_delta, leader$ccode, 
         FUN= function(x) rollmean(x, k=3, na.pad=T)) 
+0

Grazie, funziona benissimo! –