2013-04-02 12 views
6

Ho un set di timestamp e URI UNIX e sto cercando di tracciare il conteggio cumulativo delle richieste per ciascun URI. Sono riuscito a farlo per un URI alla volta utilizzando una colonna fittizia:ggplot2 e cumsum()

x.df$count <- apply(x.df,1,function(row) 1) # Create a dummy column for cumsum 
x.df <- x.df[order(x.df$time, decreasing=FALSE),] # Sort 
ggplot(x.df, aes(x=time, y=cumsum(count))) + geom_line() 

tuttavia, che renderebbe circa 30 piazzole nel mio caso.

ggplot2 fa permettono di tracciare linee multiple in un unico plot (ho copiato questo pezzo di codice da here):

ggplot(data=test_data_long, aes(x=date, y=value, colour=variable)) + 
    geom_line() 

Il problema è che, in questo modo, cumsum() conterebbe avanti e avanti.

Qualcuno ha un'idea?

+2

Potete fornire una serie di dati piccolo esempio che illustra cosa stai descrivendo? – joran

+0

sembra un lavoro per 'plyr' o' data.table'. Dividi i dati in base all'URI e poi alla tua "cumsum" su ogni pezzo. 'Data.table (x); x [, lista (count = .I), per = URI] 'O qualcosa del genere ... – Justin

risposta

8

Ecco un dati di prova che utilizza plyr s' transform per calcolare la somma cumulativa prima e poi applicare i dati per tracciare utilizzando ggplot2:

set.seed(45) 
DF <- data.frame(grp = factor(rep(1:5, each=10)), x=rep(1:10, 5)) 
DF <- transform(DF, y=runif(nrow(DF))) 

# use plyr to calculate cumsum per group of x 
require(plyr) 
DF.t <- ddply(DF, .(grp), transform, cy = cumsum(y)) 

# plot 
require(ggplot2) 
ggplot(DF.t, aes(x=x, y=cy, colour=grp, group=grp)) + geom_line() 

enter image description here

+0

Scusa, non ho capito cosa intendevi per esempi di dati, sono ancora piuttosto nuovo con R. La tua trama non In realtà mostrano le somme cumulative, comunque. Le linee dovrebbero essere monotone. (A proposito: non avresti bisogno di cums per creare quel tipo di linee, l'ECDF farebbe il lavoro.) – Bob

+1

Ho generato alcuni dati di esempio, dato che ne hai fornito uno (vedi il commento di @ joran). Immagino tu stia ancora guardando la vecchia trama? Questo * è * monotonico ed è la somma cumulativa. se vuoi vedere i punti basta aggiungere, '+ geom_point()'. – Arun

+0

Ciao Arun, grazie per il tuo aiuto. L'esempio ha funzionato, ma semplicemente non ho ottenuto un grafico monotono per i dati reali. Così ho iniziato a giocare con i numeri nell'esempio e penso che ci sia un problema con i grandi numeri. Puoi riprodurlo? – Bob