Rimodellamento dei dati delle serie temporali dal formato ampio a quello alto (per il tracciamento)

Ho un frame di dati contenente più serie temporali di resi, memorizzati in colonne.

La prima colonna contiene date e le colonne successive sono serie temporali indipendenti ciascuna con un nome. Le intestazioni delle colonne sono i nomi delle variabili.

## I have a data frame like this t <- seq(as.Date('2009-01-01'),by='days',length=10) X <- rnorm(10,0,1) Y <- rnorm(10,0,2) Z <- rnorm(10,0,4) dat <- data.frame(t,X,Y,Z) ## which appears as t XYZ 1 2009-01-01 -1.8763317 -0.1885183 -6.655663 2 2009-01-02 -1.3566227 -2.1851226 -3.863576 3 2009-01-03 -1.3447188 2.4180249 -1.543931 

Voglio tracciare ogni serie temporale come una linea su una trama separata, in un reticolo, con ogni trama etichettata dai nomi delle variabili.

Per tracciare questo con reticolo, i dati devono essere in un formato alto, in quanto tale:

  t symbol price 1 2009-01-01 X -1.8763317 2 2009-01-02 Y -0.1885183 2 2009-01-02 Z -6.655663 

Qual è una buona chiamata di funzione per fare questo?

    puoi anche usare melt () dalla libreria ‘reshape’ (penso sia più facile da usare di reshape () stesso) – questo ti farà risparmiare il passo in più di dover aggiungere nuovamente la colonna del tempo in …

     > library(reshape) > m <- melt(dat,id="t",variable_name="symbol") > names(m) <- sub("value","price",names(m)) > head(m) t symbol price 1 2009-01-01 X -1.14945096 2 2009-01-02 X -0.07619870 3 2009-01-03 X 0.01547395 4 2009-01-04 X -0.31493143 5 2009-01-05 X 1.26985167 6 2009-01-06 X 1.31492397 > class(m$t) [1] "Date" > library(latex) > xyplot( price ~ t | symbol, data=m ,type ="l", layout = c(1,3) ) 

    Per questa particolare attività, tuttavia, prenderei in considerazione l’utilizzo della libreria “zoo”, che non richiederebbe di ridefinire il frame dei dati:

     > library(zoo) > zobj <- zoo(dat[,-1],dat[,1]) > plot(zobj,col=rainbow(ncol(zobj))) 

    Gli sviluppatori / contributori di R (Gabor e Hadley in questo caso) ci hanno benedetti con molte grandi scelte. (e non può dimenticare Deepayan per il pacchetto reticolo)

    Dalla pagina di aiuto di tidyr :

    Esempi

     library(tidyr) library(dplyr) # From http://stackoverflow.com/questions/1181060 stocks <- data.frame( time = as.Date('2009-01-01') + 0:9, X = rnorm(10, 0, 1), Y = rnorm(10, 0, 2), Z = rnorm(10, 0, 4) ) gather(stocks, stock, price, -time) stocks %>% gather(stock, price, -time) 

    Se si tratta di serie temporali multivariate, considera di archiviarlo come object zoo utilizzando il pacchetto con lo stesso nome. Questo rende l’indicizzazione, la fusione, la sussistenza molto più semplice — vedi le vignette dello zoo.

    Ma come hai chiesto delle trame reticolari – e questo può anche essere fatto. In questo esempio, costruiamo un semplice “lungo” data.frame con una colonna di date, oltre a una colonna di valori “val” e una variabile id colonna “var”:

     > set.seed(42) > D <- data.frame(date=rep(seq(as.Date("2009-01-01"),Sys.Date(),by="week"),2),\ val=c(cumsum(rnorm(30)), cumsum(rnorm(30))), \ var=c(rep("x1",30), rep("x2",30))) 

    Dato che il set di dati, il plottaggio per la tua descrizione viene eseguito da xyplot dal pacchetto reticolo richiedendo un grafico di "dati dati forniti raggruppati per variabile" dove accendiamo le righe in ciascun pannello:

     > library(latex) > xyplot(val ~ date | var, data=D, panel=panel.lines) 

    Per un ‘temp’ di dataframe con la data nella prima colonna e i valori in ciascuna delle altre colonne:

     > par(mfrow=c(3,4)) # 3x4 grid of plots > mapply(plot,temp[,-1],main=names(temp)[-1],MoreArgs=list(x=temp[,1],xlab="Date",type="l",ylab="Value") ) 

    Molte grazie per le risposte della gente – la risposta di Dirk era in linea.

    Il passo mancante risultò essere usando la funzione “stack ()” per convertire il frame di dati da un formato ampio a uno lungo. Sono consapevole che potrebbe esserci un modo più semplice per farlo con la funzione reshape (), felice di vedere un esempio se qualcuno vuole pubblicarlo.

    Quindi ecco cosa ho fatto, usando il dataframe “dat” menzionato nella domanda:

     ## use stack() to reshape the data frame to a long format ##