1

我正在尝试向我的数据表中添加一个新列,其中包含以下一些行的平均值。然而,要为平均值选择多少行取决于行的时间戳。

下面是一些测试数据:

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))    

我想添加一个列,其中包含所有需求的平均值,这些需求发生在相应周前三周的周(“Weekstart”)(按艺术分组,不包括实际周)。

使用 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 周没有需求。因为我想要前三周的平均值,而不是前三行的平均值,所以平均值是错误的。相反,Art b 第 6 周的结果应如下所示:

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]
}

但这似乎很不专业(请原谅我的技能不好)。而且,不幸的是,带有 width 和 rollwidth 的 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)]

但话又说回来,平均值包括实际的一周(不是我想要的)。

有谁知道如何应用一个标准(即几周的差异应<= 3)而不是参数宽度的行数?任何建议表示赞赏!

4

0 回答 0