Remodelación de datos de series de tiempo de formato ancho a alto (para trazado)

Tengo un dataframe que contiene múltiples series temporales de devoluciones, almacenadas en columnas.

La primera columna contiene fechas, y las columnas posteriores son series de tiempo independientes, cada una con un nombre. Los encabezados de las columnas son los nombres de las variables.

## 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 

Quiero trazar cada serie de tiempo como una línea en una ttwig separada, en una red, con cada ttwig etiquetada por los nombres de las variables.

Para trazar esto con celosía, los datos deben estar en un formato alto, como tal:

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

¿Qué es una buena función para hacer esto?

también puedes usar melt () de la biblioteca ‘remodelar’ (creo que es más fácil de usar que remodelarlo), eso te ahorrará el paso adicional de tener que volver a agregar la columna de tiempo en …

 > 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(lattice) > xyplot( price ~ t | symbol, data=m ,type ="l", layout = c(1,3) ) 

Para esta tarea en particular, sin embargo, consideraría usar la biblioteca ‘zoo’, que no requeriría una remodelación del dataframe:

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

Los desarrolladores / colaboradores de R (Gabor y Hadley en este caso) nos han bendecido con muchas buenas opciones. (y no puede olvidar a Deepayan por el paquete de celosía)

Desde la página de ayuda de tidyr gather :

Ejemplos

 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) 

Si se trata de una serie temporal multivariable, considere almacenarla como un objeto de zoológico utilizando el paquete del mismo nombre. Esto hace que la indexación, la fusión y el subconjunto sean mucho más fáciles — vea las viñetas del zoológico.

Pero cuando preguntaste acerca de las ttwigs de celosía, esto también se puede hacer. En este ejemplo, construimos un data.frame ‘long’ simple con una columna de fecha, así como una columna de valor ‘val’ y una columna de variable id ‘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))) 

Dado ese conjunto de datos, el trazado de su descripción se realiza mediante xyplot desde el paquete de celosía solicitando un gráfico de "datos de valores dados agrupados por variable" donde activamos líneas en cada panel:

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

Para un dataframe ‘temp’ con la fecha en la primera columna y los valores en cada una de las otras columnas:

 > 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") ) 

Muchas gracias por las respuestas. La respuesta de Dirk fue sobre la marca.

El paso que faltaba resultó ser el uso de la función “stack ()” para convertir el dataframe de un formato ancho a uno largo. Soy consciente de que puede haber una manera más fácil de hacerlo con la función reshape (), feliz de ver un ejemplo si alguien quiere publicarlo.

Así que esto es lo que terminé haciendo, usando el dataframe ‘dat’ mencionado en la pregunta:

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