R 用自适应窗口长度计算数据表中的滚动平均值

R 用自适应窗口长度计算数据表中的滚动平均值,r,data.table,R,Data.table,我希望在具有自适应窗口的data.table中按组计算移动平均值,以便在时间序列的开头没有NAs。我知道如何使用frollmean和设置adaptive=TRUE来实现这一点(例如,请参见线程中jangorecki的响应)。当data.table中的所有组长度相同,但组大小不同时出错时,我可以使用相同的代码 例如,如果我的数据是 tmp = data.table(Gp = c(rep('A',6),rep('B',4)), Val = c(1,3,4,6,2,2,8,5,7,10)) 我做的是

我希望在具有自适应窗口的data.table中按组计算移动平均值,以便在时间序列的开头没有NAs。我知道如何使用frollmean和设置adaptive=TRUE来实现这一点(例如,请参见线程中jangorecki的响应)。当data.table中的所有组长度相同,但组大小不同时出错时,我可以使用相同的代码

例如,如果我的数据是

tmp = data.table(Gp = c(rep('A',6),rep('B',4)), Val = c(1,3,4,6,2,2,8,5,7,10))
我做的是长度为3的移动平均,那么期望的响应是

> desired_output
    Gp  Val
 1:  A 1.00
 2:  A 2.00
 3:  A 2.67
 4:  A 4.33
 5:  A 4.00
 6:  A 3.33
 7:  B 8.00
 8:  B 6.50
 9:  B 6.67
10:  B 7.33
我尝试了以下方法:

mov_window_len = vector("list",2)
mov_window_len[[1]] = c(1,2,rep(3,4))
mov_window_len[[2]] = c(1,2,rep(3,2))
tmp[,lapply(.SD, frollmean, n = mov_window_len, align = "right", adaptive = TRUE), by = Gp]
但我得到一个错误,即作为'n'参数的列表提供的整数向量的长度必须等于'x'中提供的观察数。


我们将非常感谢您对解决此问题的任何帮助。提前感谢。

您可以使用组索引
.GRP
来子集
mov\u window\u len
。这将为每个组提供正确的长度。您只想获取
Val
frollmean
,因此不需要
lappy

tmp[, frollmean(Val, n = mov_window_len[.GRP], align = "right", adaptive = TRUE), by = Gp]

#     Gp       V1
#  1:  A 1.000000
#  2:  A 2.000000
#  3:  A 2.666667
#  4:  A 4.333333
#  5:  A 4.000000
#  6:  A 3.333333
#  7:  B 8.000000
#  8:  B 6.500000
#  9:  B 6.666667
# 10:  B 7.333333
或者,可以将窗口长度添加到input data.table(
Len
下面的字段),因为它对应于每一行

tmp[Gp==“A”,Len:=mov\u window\u Len[[1]]
][Gp==“B”,镜头:=移动窗口镜头[[2]]
][,(Val,Len,RollVal=frollmean(Val,Len,adaptive=TRUE)),by=Gp]
#格兰·洛瓦尔酒店
#1:100万
#2:A 32.000000
#3:A4 2.666667
#4:A 634.333333
#5:A 23.4.000000
#6:A 23.333333
#7:B 81.000000
#8:B 5 2 6.500000
#9:B 7 3 6.666667
#10:B1037.333333

完美。我不知道。GRP。感谢您的快速响应
align=“right”
是默认设置。感谢您的回答,AFAIK这是第一个使用adaptive=T:)添加的替代方法的非我提供的答案,在将窗口len集成到数据中时,这种方法可能看起来更干净一些