2013-05-24 23 views
7

Mam ramkę szeregu czasowego i chcę obliczyć skumulowane zwroty dla symboli giełdowych w ciągu dnia dla zakresu dat. Kiedy symbol i/lub data ulegną zmianie, skumulowany zwrot powinien zostać zresetowany. Każda pomoc będzie doceniona. Poniżej znajduje się niewielka próbka mojej ramki danych, w tym informacje o tym, co powinna zwrócić kolumna sumarycznej sumy. Dzięki.Suma sumy warunkowej w 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

Mam nadzieję, że są to log powraca ... – flodel

+1

W przykładowych danych napisałem, no. W mojej prawdziwej ramce danych tak log zwraca – David

Odpowiedz

11

przy użyciu pakietu data.table jest to banalne. Jeśli dane są w data.frame zwanego dat:

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

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

Gdzie .SD jest podzbiór data.table zdefiniowany przez grupy by. Aby uzyskać więcej informacji, patrz ?data.table.

Można także przekazać nazwy kolumn bezpośrednio:

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

W danym przykładzie zrobić:

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

Dzięki za odpowiedź – David

9

Jest to typowy przypadek dla strategii split-apply-combine: można podzielić data.frame o unikalnych kombinacjach niektórych kolumn (data i symbol), zastosuj procedurę w podzbiorze (cumsum w powrocie) i połącz podzestawy z powrotem do dużego data.frame. Można to osiągnąć z łatwością ddply z pakietu 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

Dzięki za pomoc! – David