11

時系列データ フレームがあり、ある範囲の日付の日中の株式シンボルの累積リターンを計算したいと考えています。シンボルおよび/または日付が変更されると、累積リターンがリセットされます。どんな助けでも大歓迎です。累積合計列が返すものを含む、私のデータ フレームの小さなサンプルを以下に示します。ありがとう。

       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%
4

3 に答える 3

13

パッケージを使用すると、data.tableこれは簡単です。データがdata.frame呼び出された場合dat:

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

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

グループによって定義された.SDのサブセットはどこにありますか。詳細については、を参照してください。data.tableby?data.table

列名を直接渡すこともできます。

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

特定の例では、次のようにします。

DT[, Return := as.numeric(sub('%$', '', Return))]
DT[!is.na(Return), Cumulative.Sum := cumsum(Return), by = c('Date', 'Symbol')]
于 2013-05-24T18:58:47.857 に答える
11

これは、分割-適用-結合戦略の典型的なケースです。特定の列 (Date と Symbol) の一意の組み合わせで分割し、( Return で)data.frameサブセットにプロシージャを適用し、サブセットを結合して大きな に戻します。これは、パッケージから簡単に実現できます。cumsumdata.frameddplyplyr

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
于 2013-05-24T19:00:55.930 に答える