2015-02-03 9 views
5

Ich versuche, die neuen dygraphs für R Bibliothek zu verwenden, um Gewinnzeiten für Männer und Frauen beim Boston Marathon jedes Jahr zu zeichnen. Ich habe einen Datenrahmen bekam mal durch die zweite zu gewinnen, ist hier ein Teil davon:Verwenden Sie dygraph für R, um xts Zeitreihe nur nach Jahr zu plotten?

winners <- data.frame(year=1966:1971, mensec=c(8231, 8145, 8537, 8029, 7830, 8325), womensec=c(12100, 12437, 12600, 12166, 11107, 11310)) 

Aber ich weiß nicht, wie ein xts Objekt von diesem zu erstellen. Ich kann eine reguläre Zeitreihen aus jeder Spalte erstellen und jede Kurve, die ein mit dygraph in einem separaten Diagramm

men <- ts(winners$mensec, frequency = 1, start=winners$year[1]) 
dygraph(men) 
women <- ts(winners$womensec, frequency = 1, start=winners$year[1]) 
dygraph(women) 

Wenn ich versuche, die Zeitreihe cbind wird es nicht

both <- cbind(men, women) 
dygraph(both) 

Die in dygraph arbeiten Fehlermeldung ist

Fehler in XTS (x.mat, order.by = order.by, Frequenz = Frequenz (x), ...): NROW (x) muss Einstimmungslänge (order.by)

Beliebig Vorschläge? Danke

Antwort

7

Das sieht wie ein Fehler in as.xts.ts aus. Es verwendet length(x), um die Sequenz der Daten für den Index zu erstellen, die die Anzahl der Elemente für eine Matrix (nicht die Anzahl der Zeilen) zurückgibt.

Sie können umgehen, indem Sie as.xts auf Ihre ts Objekte vor dem Aufruf cbind auf ihnen verwenden.

both <- cbind(men=as.xts(men), women=as.xts(women)) 
+0

gut zu wissen. Glaub mir nicht, dass ich das schon einmal erlebt habe. – timelyportfolio

3

Sieht aus wie Joshua die Frage beantwortet. Hier ist die vollständige Antwort mit etwas anderem Code und auch mit einem Jahr X-Achsen-Formatierer.

library(xts) 
library(dygraphs) 

winners <- data.frame(
    year=1966:1971 
    , mensec=c(8231, 8145, 8537, 8029, 7830, 8325) 
    , womensec=c(12100, 12437, 12600, 12166, 11107, 11310) 
) 

winners_xts <- as.xts(
    winners[-1] 
    , order.by = as.Date(
    paste0(winners$year,"-01-01",format="%Y-01-01") 
) 
) 

dygraph(winners_xts) %>% 
    dyAxis( 
    name="x" 
    ,axisLabelFormatter = "function(d){ return d.getFullYear() }" 
) 

# using the original data here is a way to merge 
# merge will work just like cbind 
# but need to convert to xts first 
men <- ts(winners$mensec, frequency = 1, start=winners$year[1]) 
women <- ts(winners$womensec, frequency = 1, start=winners$year[1]) 
do.call(merge,Map(as.xts,list(men=men,women=women)))