假设我有一个数据框如下(仅前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天(不包括实际日期)的客户用户的汇总收入日期即可。必须对每一行进行此计算。
如何在不使用循环的情况下执行此操作,因为数据大小相当大,所以这不是一个选项。
非常感谢提前!
答案 0 :(得分: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