2011-01-17 7 views
4

Ich habe überall gesucht, aber ich kann nicht finden, wo diese Frage zuvor gestellt wurde.Lesen Sie eine Zeitreihentabelle mit read.zoo

Was ist ein sauberer Weg, um diese Daten in eine richtige Zoo-Serie zu bekommen? Diese Version ist ein Copy/Paste, um diesen Beitrag einfacher zu machen, aber er kommt immer in der folgenden Tabelle (aus einer Textdatei). Meine read.zoo() - Anweisung liest das Jahr als Index, aber die Viertel (Qtr1, Qtr2 usw.) werden als Spaltennamen gelesen. Ich habe versucht, einen nicht-Müll Weg zu finden, um die Spalten als "Viertel" Teil des Indexes zu lesen, aber es ist schlampig (zu schlampig zum Posten). Ich schätze, dieses Problem wurde bereits gelöst, aber ich kann es nicht finden.

> 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 

Vom as.yearqtr() Dokumentation, sieht das Ziel wie:

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  

Antwort

3

Lesen Sie die Daten mit read.zoo ein und konvertieren Sie sie dann in ein zooreg Objekt mit yearqtr Zeitindex:

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) 

Das Ergebnis sieht wie folgt aus:

> 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 
+0

Dieser Schritt von t (coredata (z)) nach c (t (coredata (z))) war eine echte Überraschung. Es hätte nicht sein sollen, aus der Matrix() -Antwort, aber es war. –

+1

Beachten Sie, dass Bills Kommentar 'c (t (coredata (z)))' bearbeitet wurde, um ihn zu 'c (t (z))' zu verkürzen. –

3

read.zoo Ihre Daten höchstens eine Zeitindex Spalte annimmt, so dass Sie diese Texte selbst zu verarbeiten. Zuerst lesen Sie es sich mit der read.table

zt <- read.table(textConnection(texinp), header = TRUE) 

dann wandeln sie in einer "langen Tisch" mit der melt Funktion aus dem reshape Paket:

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 

und schließlich die gewünschte zoo-Objekt erstellen:

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 
+0

Das ist ein wirklich gutes Beispiel für die Schmelze() Funktion Dokumentation wäre. Ich habe diesen Pfad gestartet, aber meine Version von zt war zt <-read.zoo(). Es endete nicht sauber. –