Leer una tabla de series de tiempo usando read.zoo
-
11-10-2019 - |
Pregunta
He mirado por todo el lugar, pero no puedo encontrar dónde esta pregunta se ha hecho antes.
¿Qué es una forma limpia para obtener estos datos en una serie zoológico adecuado? Esta versión es un copiar / pegar para hacer este post más fácil, pero siempre vendrá en la siguiente forma de tabla (a partir de un archivo de texto). Mi declaración read.zoo () lee el año como el índice, pero los cuartos (Qtr1, Qtr2, etc) se leen como nombres de columna. He estado tratando de encontrar una manera no-basura para leer las columnas como la parte "cuarto" del índice, pero es descuidado (demasiado descuidado a post). Supongo que este problema ya ha sido resuelto, pero no puedo encontrarlo.
> texinp <- "
+ Year Qtr1 Qtr2 Qtr3 Qtr4
+ 1992 566 443 329 341
+ 1993 344 212 133 112
+ 1994 252 252 199 207"
> z <- read.zoo(textConnection(texinp), header=TRUE)
> z
A partir de la documentación as.yearqtr (), el objetivo se vería así:
1992 Q1 1992 Q2 1992 Q3 1992 Q4 1993 Q1 1993 Q2 1993 Q3 1993 Q4
566 443 329 341 344 212 133 112
1994 Q1 1994 Q2 1994 Q3 1994 Q4
252 252 199 207
Solución
Leer en los datos utilizando read.zoo
y luego convertirlo en un objeto zooreg
con índice de tiempo yearqtr
:
texinp <- "Year Qtr1 Qtr2 Qtr3 Qtr4
1992 566 443 329 341
1993 344 212 133 112
1994 252 252 199 207"
library(zoo)
z <- read.zoo(text = texinp, header=TRUE)
zz <- zooreg(c(t(z)), start = yearqtr(start(z)), freq = 4)
El resultado es similar al siguiente:
> zz
1992 Q1 1992 Q2 1992 Q3 1992 Q4 1993 Q1 1993 Q2 1993 Q3 1993 Q4 1994 Q1 1994 Q2 1994 Q3 1994 Q4
566 443 329 341 344 212 133 112 252 252 199 207
Otros consejos
read.zoo
asume sus datos tiene como máximo la columna de un índice de tiempo, así que hay que procesar esto por sí mismo. Primero leyó en el uso de read.table
zt <- read.table( textConnection( texinp ), header = TRUE)
A continuación, convertirlo en una "tabla larga" usando la función melt
del paquete reshape
:
require(reshape)
zt.m <- melt( zt, id = 'Year', variable_name = 'Qtr')
> zt.m
Year Qtr value
1 1992 Qtr1 566
2 1993 Qtr1 344
3 1994 Qtr1 252
4 1992 Qtr2 443
5 1993 Qtr2 212
6 1994 Qtr2 252
7 1992 Qtr3 329
8 1993 Qtr3 133
9 1994 Qtr3 199
10 1992 Qtr4 341
11 1993 Qtr4 112
12 1994 Qtr4 207
y finalmente crear el objeto de zoo
deseada:
z <- with( zt.m, zoo( value, as.yearqtr(paste(Year, Qtr), format = '%Y Qtr%q')))
> z
1992 Q1 1992 Q2 1992 Q3 1992 Q4 1993 Q1 1993 Q2 1993 Q3 1993 Q4 1994 Q1 1994 Q2
566 443 329 341 344 212 133 112 252 252
1994 Q3 1994 Q4
199 207