2011-01-21 9 views
5

Ho un dataframe che è una cronologia di esecuzioni. Alcune delle variabili includono una data (in POSIXct) e un valore per quella esecuzione (here = size). Voglio produrre vari grafici che mostrano una linea basata sul totale della colonna delle dimensioni per un particolare intervallo di date. Idealmente mi piacerebbe utilizzare lo stesso set di dati e cambiare da totali a settimana, 2 settimane, trimestre trimestre.È possibile "bin" i valori per data per ottenere un totale per 2 settimane in ggplot2 e R?

Ecco un set di dati di esempio;

require(ggplot2) 
set.seed(666) 

seq(Sys.time()-(365*24*60*60), Sys.time(), by="day") 

foo<-data.frame(Date=sample(seq(today-(365*24*60*60), today, by="day"),50, replace=FALSE), 
     value=rnorm(50, mean=100, sd=25), 
     type=sample(c("Red", "Blue", "Green"), 50, replace=TRUE)) 

Posso creare questo grafico che mostra valori individuali;

ggplot(data=foo, aes(x=Date, y=value, colour=type))+stat_summary(fun.y=sum, geom="line") 

Oppure posso farlo per mostrare una somma al mese;

ggplot(data=foo, aes(x=format(Date, "%m %y"), y=value, colour=type))+stat_summary(fun.y=sum, geom="line", aes(group=type)) 

Tuttavia diventa più complicato per fare le somme per trimestre/2 settimane ecc Idealmente mi piacerebbe qualcosa di simile al stat_bin e stat_summary combinato così ho potuto specificare un binwidth (o hanno ggplot fare una migliore ipotesi basata su la gamma)

Mi manca qualcosa di ovvio, o è semplicemente impossibile?

risposta

10

è abbastanza facile con plyr e lubridate a che fare tutti i calcoli da soli:

library(plyr) 
library(lubridate) 

foo <- data.frame(
    date = sample(today() + days(1:365), 50, replace = FALSE), 
    value = rnorm(50, mean = 100, sd = 25), 
    type = sample(c("Red", "Blue", "Green"), 50, replace = TRUE)) 

foo$date2 <- floor_date(foo$date2, "week") 
foosum <- ddply(foo, c("date2", "type"), summarise, 
    n = length(value), 
    mean = mean(value)) 

ggplot(foosum, aes(date2, mean, colour = type)) + 
    geom_point(aes(size = n)) + 
    geom_line() 
+0

Non avevo visto il pacchetto lubridate, quindi è grandioso, taglia un sacco di codice dal mio tentativo di fare settimane/trimestri manualmente usando il taglio. Grazie ! – PaulHurleyuk

1

Il pacchetto chron potrebbe essere molto utile per convertire le date in un modo non trattato nel comando "base" format. Ma quest'ultimo può anche fare cose intelligenti (come il strftime in PHP), ad esempio:

Mostra dato anno e il mese di una data:

format(foo$Date, "%Y-%m") 

E con il pacchetto Chron mostrando il trimestre appropriata dell'anno :

quarters(foo$Date) 

per calcolare il periodo di 2 settimane, si potrebbe non trovare una funzione completa, ma potrebbe essere calcolato da un certo numero settimana facilmente, per esempio:

floor(as.numeric(format(foo$Date, "%V"))/2)+1 

Dopo aver calcolato le nuove variabili nel dataframe, è possibile tracciare facilmente i dati proprio come nell'esempio originale.

+0

C'è una funzione strftime in R: http://finzi.psych.upenn.edu/R/library/base/html /strptime.html –

Problemi correlati