Leggere un tavolo serie temporale utilizzando read.zoo
-
11-10-2019 - |
Domanda
Ho guardato dappertutto, ma non riesco a trovare dove questa domanda è stato chiesto prima.
Che cosa è un modo pulito per ottenere questi dati in una serie zoo corretta? Questa versione è una copia / incolla per rendere più facile questo post, ma sarà sempre venire nella forma seguente tabella (da un file di testo). Il mio read.zoo () dichiarazione si legge dell'anno come l'indice, ma i quartieri (Qtr1, Qtr2, ecc) vengono letti come nomi di colonna. Ho cercato di capire un modo non-spazzatura per leggere le colonne come la parte "quarto" dell'indice, ma è sciatto (troppo sciatta per post). Sto indovinando questo problema è già stato risolto, ma non riesco a trovarlo.
> 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
Dalla documentazione as.yearqtr (), l'obiettivo sarà simile:
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
Soluzione
leggere i dati utilizzando read.zoo
e quindi convertirlo in un oggetto con indice zooreg
tempo 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)
Gli sguardi risultato come questo:
> 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
Altri suggerimenti
read.zoo
presuppone che i dati sono al massimo una sola volta colonna-index, in modo da avere per elaborare da soli. In primo luogo lo lesse nel usando read.table
zt <- read.table( textConnection( texinp ), header = TRUE)
quindi convertirlo in una "tavola lunga" utilizzando la funzione melt
dal pacchetto 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
e, infine, creare l'oggetto zoo
desiderata:
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