rpubs - Transformar una serie de tiempo en un marco de datos y volver
series de tiempo mensual en r (1)
Aquí hay dos formas. La primera forma crea dimnames para la matriz que se va a crear y luego enruta los datos en una matriz, los transpone y los convierte en marcos de datos. La segunda forma crea una lista que consiste en variables de año y mes y se usa de forma simultánea en esa conversión posterior a marco de datos y adición de nombres.
# create test data
set.seed(123)
tt <- ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)
1) matriz . Esta solución requiere que tengamos años consecutivos enteros
dmn <- list(month.abb, unique(floor(time(tt))))
as.data.frame(t(matrix(tt, 12, dimnames = dmn)))
Si no nos importan los buenos nombres, es solo como as.data.frame(t(matrix(tt, 12)))
.
2) tapply . Una solución más general utilizando tapply
es:
tapply(tt, list(year = floor(time(tt)), month = month.abb[cycle(tt)]), c)
Si no nos importan los nombres, podemos reemplazar month.abb[cycle(tt)]
con solo cycle(tt)
.
Nota: Para invertir esto, suponga que DF
es cualquiera de las soluciones de marcos de datos anteriores. Entonces intenta:
ts(c(t(DF)), start = 1981, freq = 12)
La salida de una serie de tiempo se ve como un marco de datos:
ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)
Jan Feb Mar Apr May Jun Jul ...
1981 14.064085 21.664250 14.800249 -5.773095 16.477470 1.129674 16.747669 ...
1982 23.973620 17.851890 21.387944 28.451552 24.177141 25.212271 19.123179 ...
1983 19.801210 11.523906 8.103132 9.382778 4.614325 21.751529 9.540851 ...
1984 15.394517 21.021790 23.115453 12.685093 -2.209352 28.318686 10.159940 ...
1985 20.708447 13.095117 32.815273 9.393895 19.551045 24.847337 18.703991 ...
Sería útil transformarlo en un marco de datos con columnas Jan, Feb, Mar ... y filas 1981, 1982, ... y luego volver. ¿Cuál es la forma más elegante de hacer esto?