2013-05-24 13 views
7

Ho un frame di dati di serie temporali e voglio calcolare i ritorni cumulativi per i simboli azionari intra-day per un intervallo di date. Quando il simbolo e/o la data cambiano, il rendimento cumulativo dovrebbe essere ripristinato. Qualsiasi aiuto sarebbe apprezzato. Un piccolo campione del mio frame di dati è al di sotto di ciò che deve essere restituito dalla colonna della somma cumulativa. Grazie.Somma cumulativa condizionale in R

 Date Symbol Time Last Return Cumulative.Sum 
1 1/2/2013  AA 9:30 42.00 n/a   n/a 
2 1/2/2013  AA 12:00 42.50 1.19%   1.19% 
3 1/2/2013  AA 16:00 42.88 0.89%   2.08% 
4 1/2/2013 AAPL 9:30 387.00 n/a   n/a 
5 1/2/2013 AAPL 12:00 387.87 0.22%   0.22% 
6 1/2/2013 AAPL 16:00 388.69 0.21%   0.44% 
7 1/3/2013  AA 9:30 42.88 n/a   n/a 
8 1/3/2013  AA 12:00 42.11 -1.80%   -1.80% 
9 1/3/2013  AA 16:00 41.89 -0.52%   -2.32% 
+0

Spero che questi sono i rendimenti di registro ... – flodel

+1

Nella dati di esempio che ho postato, no. Nel mio vero frame di dati, il log restituisce – David

risposta

11

utilizzando il pacchetto data.table questo è banale. Se i dati sono in un data.frame chiamato dat:

library(data.table) 
DT <- data.table(dat) 

DT[, your_cumsum_function(.SD), by=c('Date', 'Symbol')] 

Dove .SD è il sottoinsieme del data.table definito dai by gruppi. Vedere ?data.table per ulteriori informazioni.

È possibile passare anche i nomi delle colonne direttamente:

DT[, your_cumsum_function(Last), by=c('Date', 'Symbol')] 

Nel vostro esempio particolare, fare:

DT[, Return := as.numeric(sub('%$', '', Return))] 
DT[!is.na(Return), Cumulative.Sum := cumsum(Return), by = c('Date', 'Symbol')] 
+0

Grazie per la risposta – David

9

Questo è un caso tipico per la strategia split-apply-combine: dividere il data.frame da combinazioni uniche di alcune colonne (Data e simbolo), applicare una procedura sul sottoinsieme (cumsum in Ritorno) e combinare i sottoinsiemi in un grande data.frame. Ciò può essere ottenuto facilmente con ddply dal pacchetto plyr:

mdf$Return <- as.numeric(sub("(\\d+\\.\\d+)\\%", "\\1", mdf$Return)) 
mdf$Return[ is.na(mdf$Return) ] <- 0 

library(plyr) 
ddply(mdf, .(Date,Symbol), transform, Cumulative.Sum = cumsum(Return)) 

     Date Symbol Time Last Return Cumulative.Sum 
1 1/2/2013  AA 9:30 42.00 0.00   0.00 
2 1/2/2013  AA 12:00 42.50 1.19   1.19 
3 1/2/2013  AA 16:00 42.88 0.89   2.08 
4 1/2/2013 AAPL 9:30 387.00 0.00   0.00 
5 1/2/2013 AAPL 12:00 387.87 0.22   0.22 
6 1/2/2013 AAPL 16:00 388.69 0.21   0.43 
7 1/3/2013  AA 9:30 42.88 0.00   0.00 
8 1/3/2013  AA 12:00 42.11 -1.80   -1.80 
9 1/3/2013  AA 16:00 41.89 -0.52   -2.32 
+0

Grazie per l'aiuto! – David