gpt4 book ai didi

r - 使用自适应窗口长度计算 data.table 中的滚动平均值

转载 作者:行者123 更新时间:2023-12-05 03:58:53 25 4
gpt4 key购买 nike

我希望在具有自适应窗口的 data.table 中按组计算移动平均值,以便在时间序列的开头没有 NA。我知道如何使用 frollmean 并设置 adaptive = TRUE 来做到这一点(例如参见 jangorecki 在 this 线程中的响应)。当我的 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]

但我收到一条错误消息,说 length of integer vector(s) provided as list to 'n' argument must be equal to number of observations provided in 'x'

如果您能帮助解决这个问题,我们将不胜感激。提前致谢。

最佳答案

您可以使用组索引 .GRPmov_window_len 进行子集化。这将为您提供每个组的正确长度。您只想获取 Valfrollmean,因此不需要 lapply

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

或者,可以将窗口长度添加到输入 data.table(下面的 Len 字段),因为它对应于每一行。

tmp[Gp=="A", Len:=mov_window_len[[1]]
][Gp=="B", Len:=mov_window_len[[2]]
][, .(Val, Len, RollVal=frollmean(Val, Len, adaptive=TRUE)), by=Gp]
# Gp Val Len RollVal
# 1: A 1 1 1.000000
# 2: A 3 2 2.000000
# 3: A 4 3 2.666667
# 4: A 6 3 4.333333
# 5: A 2 3 4.000000
# 6: A 2 3 3.333333
# 7: B 8 1 8.000000
# 8: B 5 2 6.500000
# 9: B 7 3 6.666667
#10: B 10 3 7.333333

关于r - 使用自适应窗口长度计算 data.table 中的滚动平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57615558/

25 4 0