Zeitreihendaten vom Wide- zum High-Format umformen (zum Plotten)

Ich habe einen Datenrahmen mit mehreren Zeitreihen von Rückgaben, in Spalten gespeichert.

Die erste Spalte enthält Datumsangaben und nachfolgende Spalten sind unabhängige Zeitreihen mit jeweils einem Namen. Die Spaltenüberschriften sind die Variablennamen.

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

Ich möchte jede Zeitreihe als eine Linie auf einem separaten Diagramm in einem Gitter plotten, wobei jedes Diagramm mit den Variablennamen beschriftet ist.

Um dies mit Gitter darzustellen, müssen die Daten in einem hohen Format vorliegen:

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

Was ist ein guter functionsaufruf, um dies zu tun?

Solutions Collecting From Web of "Zeitreihendaten vom Wide- zum High-Format umformen (zum Plotten)"

Sie können auch melt () aus der ‘reshape’ Bibliothek verwenden (ich denke, es ist einfacher zu benutzen als reshape () selbst) – das erspart Ihnen den zusätzlichen Schritt, dass Sie die Zeitspalte wieder hinzufügen müssen …

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

Für diese spezielle Aufgabe würde ich jedoch die Bibliothek ‘zoo’ in Erwägung ziehen, bei der Sie den Datenrahmen nicht umformen müssen:

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

R Entwickler / Mitwirkende (Gabor und Hadley in diesem Fall) haben uns mit vielen großartigen Entscheidungen gesegnet. (und kann Deepayan für das Gitterpaket nicht vergessen)

Von tidyr sammeln Hilfe-Seite:

Beispiele

 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) 

Wenn es sich um eine multivariate Zeitreihe handelt, sollten Sie es als Zoo-Objekt speichern, indem Sie das Paket mit demselben Namen verwenden. Dies erleichtert das Indizieren, Zusammenführen, Unterteilen – siehe Zoo-Vignetten.

Aber wie Sie nach Gitterparzellen gefragt haben – und das kann auch gemacht werden. In diesem Beispiel konstruieren wir einen einfachen ‘langen’ Datenrahmen mit einer Datumsspalte sowie eine Wertespalte ‘val’ und eine Variablenspalte ‘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))) 

Bei diesem Dataset wird das Plotten nach Ihrer Beschreibung von xyplot aus dem Gitterpaket durchgeführt, indem Sie nach einem Plot von "Wert gegebene Daten gruppiert nach Variable" fragen, wobei wir die Linien in jedem Feld aktivieren:

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

Für einen Datenrahmen ‘temp’ mit dem Datum in der ersten Spalte und Werten in jeder der anderen Spalten:

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

Vielen Dank für die Antworten der Leute – Dirks Antwort war auf Mark.

Der fehlende Schritt erwies sich als “stack ()” -function, um den Datenrahmen von einem breiten in ein langes Format zu konvertieren. Ich bin mir bewusst, dass es einen einfacheren Weg gibt, dies mit der reshape () – function zu tun, glücklich, ein Beispiel zu sehen, wenn jemand es posten möchte.

Also hier ist, was ich getan habe, mit dem ‘Dat’ Datenrahmen in der Frage erwähnt:

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