我有一张像这样的桌子:

ppp<-data.frame(client=c(1,1,1,3,3),
                calldate=c('2014-08-07', '2014-08-09','2014-08-06','2014-08-07', '2014-08-08'),
                cant=c(1,2,3,2,1))


我需要计算每个客户几天内的累积累积费用。
在这种情况下,我需要获取下表:

client    calldate   cant   cum cant
     1  06/08/2014      3          3
     1  07/08/2014      1          4
     1  09/08/2014      2          6
     2  07/08/2014      2          2
     2  08/08/2014      1          3


我尝试了这个,然后得到了严格的解决方案:

ppp <- ppp[order(ppp$client,ppp$calldate),]
ppp$cumsum<-unlist(tapply(ppp$cant,ppp$client,FUN=cumsum))


但这是最好的方法吗?为每个客户创建一个列表,然后取消列出列表?另外,因为我没有指定日期字段,所以我只对数据进行排序。

最佳答案

data.table选项

library(data.table) # 1.9.4+
setorder(setDT(ppp), client, calldate)[, cum_cant := cumsum(cant), by = client]
ppp
#    client   calldate cant cum_cant
# 1:      1 2014-08-06    3        3
# 2:      1 2014-08-07    1        4
# 3:      1 2014-08-09    2        6
# 4:      3 2014-08-07    2        2
# 5:      3 2014-08-08    1        3




编辑:对于较旧的data.table版本(setkey代替setorder

setkey(setDT(ppp), client, calldate)[, cum_cant := cumsum(cant), by = client]




编辑#2(根据OP的评论):

setkey(setDT(ppp), client, calldate)[, `:=`(cum_cant = cumsum(cant),
                                            cummin_cant = cummin(cant)), by = client]

08-25 06:39