2010-10-20 9 views
5

Ho un data.frame che ha più colonne. Una delle colonne è il tempo ed è quindi non-decrescente. Il resto delle colonne contiene le osservazioni registrate nel momento indicato dall'ora specificata in una determinata riga del data.frame.Valore medio basato sul tempo (finestra scorrevole) di colonne in un data.frame

Desidero selezionare una finestra di tempo, pronunciare "x" secondi e calcolare la media (o qualsiasi altra funzione) delle voci in alcune altre colonne nello stesso data.frame per quella finestra.

Ovviamente, poiché è una media basata sul tempo, il numero di voci in una finestra può variare a seconda dei dati. Questo perché il numero di righe appartenenti a una determinata finestra temporale può variare.

L'ho fatto utilizzando una funzione personalizzata, che crea una nuova colonna nel data.frame. La nuova colonna assegna un singolo numero a tutte le voci in una finestra temporale. Il numero è unico in tutte le finestre temporali. Questo in sostanza divide i dati in gruppi in base alle finestre temporali. Quindi uso la funzione "aggregata" di R per calcolare la media.

Mi stavo chiedendo se esiste una funzione R esistente che può fare il raggruppamento in base a un intervallo di tempo o se esiste un modo migliore (più pulito) per farlo.

+0

Potrebbe fornire alcuni dati di esempio? La soluzione migliore dipenderà da come appaiono i tuoi dati. –

+0

Mi stavo chiedendo se è possibile, perché lo faccio da solo ma è molto consumante della CPU quindi non so forse devo impostare le finestre su un valore più grande, comunque TY;) – HanniBaL90

risposta

4

Assumendo che il data.frame contiene solo dati numerici, questo è un modo per farlo utilizzando XTS zoo /:

> Data <- data.frame(Time=Sys.time()+1:20,x=rnorm(20)) 
> xData <- xts(Data[,-1], Data[,1]) 
> period.apply(xData, endpoints(xData, "seconds", 5), colMeans) 
          [,1] 
2010-10-20 13:34:19 -0.20725660 
2010-10-20 13:34:24 -0.01219346 
2010-10-20 13:34:29 -0.70717312 
2010-10-20 13:34:34 0.09338097 
2010-10-20 13:34:38 -0.22330363 

EDIT: utilizzando pacchetti R unica base. I mezzi sono gli stessi, ma i tempi sono leggermente diversi perché endpoints inizia l'intervallo di 5 secondi con la prima osservazione. Il codice sotto gruppi su intervalli di 5 secondi che iniziano con secondi = 0.

+0

Grazie per la tua risposta , è corretto ma sono ancora interessato a come gli altri potrebbero risolverlo usando R – nixbox

+0

Ma questo sta usando R ... o stai cercando una soluzione che usi solo pacchetti R di base? –

+0

sì qualcosa che usa base R o almeno conserva il tipo data.frame, anche se ho controllato che posso usare as.data.frame sulle xts per riconvertirlo, l'unica cosa è che dovrei aggiungere esplicitamente un'altra colonna usando la riga .names (informazioni temporali) per creare grafici con ggplot2 – nixbox

Problemi correlati