我正在尝试向数据表中添加一个新列,其中包含以下某些行的平均值。但是,为平均值选择的行数取决于行的时间戳。
以下是一些测试数据:
DT<-data.table(Weekstart=c(1,2,2,3,3,4,5,5,6,6,7,7,8,8,9,9),Art=c("a","b","a","b","a","a","a","b","b","a","b","a","b","a","b","a"),Demand=c(1:16))
我想添加一个列,其中包含所有需求的平均值,这些列在几周内(“周开始”)发生,直到相应周之前的三周(按艺术分组,不包括实际周)。
来自zoo-library的rollapply,它的工作原理如下:
setorder(DT,-Weekstart)
DT[,RollMean:=rollapply(Demand,width=list(1:3),partial=TRUE,FUN=mean,align="left",fill=NA),.(Art)]
然而问题是,缺少一些数据。在该示例中,Art b的数据缺少第4周,第4周没有需求。因为我想要前三周的平均值,而不是之前的三行,平均值是错误的。相反,第6周Art b的结果应如下所示:
DT[Art=="b"&Weekstart==6,RollMean:=6]
(6而不是14/3,因为只有第5周和第3周计数:(8 + 4)/ 2)
到目前为止,我感到厌倦了:
可以循环遍历以下行的周的最小值,以便创建一个向每行定义的向量,“宽度”应该有多宽(新列'rollwidth'):
i<-3
DT[,rollwidth:=Weekstart-rollapply(Weekstart,width=list(1:3),partial=TRUE,FUN=min,align="left",fill=1),.(Art)]
while (max(DT[,Weekstart-rollapply(Weekstart,width=list(1:i),partial=TRUE,FUN=min,align="left",fill=NA),.(Art)][,V1],na.rm=TRUE)>3) {
i<-i-1
DT[rollwidth>3,rollwidth:=i]
}
但这似乎非常不专业(原谅我糟糕的技能)。而且,遗憾的是,宽度和滚动宽度的rollapply无法按预期工作(产生警告,因为'rollwidth'被视为表中的所有rollwidth):
DT[,RollMean2:=rollapply(Demand,width=list(1:rollwidth),partial=TRUE,FUN=mean,align="left",fill=NA),.(Art)]
工作是什么
DT[,RollMean3:=rollapply(Demand,width=rollwidth,partial=TRUE,FUN=mean,align="left",fill=NA),.(Art)]
然而又一次,平均值包括实际的一周(不是我想要的)。
是否有人知道如何应用一个标准(即周数的差异应为&lt; = 3)而不是参数宽度的行数? 任何建议都表示赞赏!