2013-10-23 69 views
1

可以說我有如下的數據幀(僅第一3列),其中總和是例如由客戶用戶一天日期產生的收入:- [R //薩姆通過基於時間範圍

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總和(previous5days)],這是彙總收入爲客戶用戶在過去5天(不包括實際爲準)具體日期 。這個計算必須針對每一行進行。

如何在不使用循環的情況下執行此操作,由於數據大小相當大,因此這不是一個選項。

非常感謝提前!

+0

看看'rollsum'和其他'卷*'功能'zoo'。 – Justin

回答

5

使用data.table可以levearge鍵:

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 
+1

很好的答案,+1!我_have_學習data.table ... – Henrik

+0

完美的作品,非常感謝!如果日期格式爲POSIX格式,我將如何調整腳本,並且我想彙總前5秒/分鐘/小時的交易? – user2635656

+0

將列(或添加一個新列)轉換爲'as.ITime'。然後你會改變秒數。 (即分鐘爲「+5 * 60」,持續5小時爲「+5 * 60 * 60」) –