1

次のようなデータ フレームがあるとしましょう (最初の 3 列のみ)。合計は、たとえば、日付に顧客ユーザーによって生成された収益です。

user    date    sum sum(previous5days)
A   2013-01-01  10  0
A   2013-01-02  20  10
A   2013-01-03  10  30
A   2013-01-05  5   40
A   2013-01-06  6   45
A   2013-01-08  7   21
A   2013-01-09  4   22
A   2013-01-10  0   22
B   2013-01-06  1   0
B   2013-01-07  1   1

ここで、列 4 [sum(previous5days)] を計算します。これは、特定の日付の過去 5 日間 (実際の日付は含まれません) の顧客ユーザーの収益の合計です。この計算は、行ごとに実行する必要があります。

データサイズがかなり大きいため、ループを使用せずにこれを行うにはどうすればよいですか。ループはオプションではありません。

よろしくお願いします!

4

1 に答える 1

6

を使用data.tableすると、キーを活用できます。

library(data.table)
DT <- data.table(<yourdata>)
setkey(DT, user, date)

DT[, sumSum := DT[ .(.BY[[1]], .d+(-5:-1) )][, sum(sum, na.rm=TRUE)] , by=list(user, .d=date)]
DT
#      user       date sum sum.previous5days. sumSum
#   1:    A 2013-01-01  10                  0      0
#   2:    A 2013-01-02  20                 10     10
#   3:    A 2013-01-03  10                 30     30
#   4:    A 2013-01-05   5                 40     40
#   5:    A 2013-01-06   6                 45     45
#   6:    A 2013-01-08   7                 21     21
#   7:    A 2013-01-09   4                 22     18   <~~~ Discrepency
#   8:    A 2013-01-10   0                 22     22
#   9:    B 2013-01-06   1                  0      0
#  10:    B 2013-01-07   1                  1      1
于 2013-10-23T15:59:45.657 に答える