【发布时间】:2014-05-03 06:52:30
【问题描述】:
有没有人开发出一种优雅、快速的方法来按日期执行滚动求和?例如,如果我想通过 Cust_ID 为以下数据集创建一个滚动的 180 天总计,有没有办法更快地做到这一点(就像 data.table 中的东西)。目前我一直在使用下面的例子来计算滚动和,但恐怕效率太低了。
library("zoo")
library("plyr")
library("lubridate")
##Make some sample variables
set.seed(1)
Trans_Dates <- as.Date(c(31,33,65,96,150,187,210,212,240,273,293,320,
32,34,66,97,151,188,211,213,241,274,294,321,
33,35,67,98,152,189,212,214,242,275,295,322),origin="2010-01-01")
Cust_ID <- c(rep(1,12),rep(2,12),rep(3,12))
Target <- rpois(36,3)
##Combine into one dataset
Example.Data <- data.frame(Trans_Dates,Cust_ID,Target)
##Create extra variable with 180 day rolling sum
Example.Data2 <- ddply(Example.Data, .(Cust_ID),
function(datc) adply(datc, 1,
function(x) data.frame(Target_Running_Total =
sum(subset(datc, Trans_Dates>(as.Date(x$Trans_Dates)-180) & Trans_Dates<=x$Trans_Dates)$Target))))
#Print new data
Example.Data2
【问题讨论】:
-
对于每个客户,对于每笔交易,您想要过去 180 天的目标总和?
-
只为每个客户。基本上是基于前 180 天的每个客户的“目标”总和。
-
那么为什么您的示例结果不是只有三行?
-
因为
180 + 11tyday 时间跨度中可以有11ty many + 1180 天的块 -
如果您通过
Cust_ID拆分数据帧,可能使用aggregate或类似工具,您可以在每个子集上运行rollapply。这就是你所需要的吗?
标签: r variables data.table plyr