首页 > 解决方案 > 在没有for循环的情况下按组获取重叠平均值(动物园,data.table)

问题描述

我有一个data.table时间序列,并试图计算重叠时间间隔上的几个聚合,例如,在二月,我想获得一月和二月、三月-二月和三月等数据的平均值。

我可以使用 for 循环来计算这个,但由于我data.table包含超过 300 000 行和几个变量,我想知道是否有更有效/优雅的方法来实现这一点。我尝试以各种方式rollapplyzoo包中使用,但没有得到预期的结果。

library(data.table)
library(zoo)

# sample data 
dt <- data.table(day = Sys.Date() - 100:1, var = 1:100)
dt[, month := month(day)]

# by 1 month is pretty obvious 
dt[, mean(var), by = month]
   month   V1
1:     7  1.5
2:     8 18.0
3:     9 48.5
4:    10 79.0
5:    11 97.5

# by 2 months - solution using for loop = expected result
for (m in unique(dt[, month])[-1]) {
    dt[month == m, res := mean(dt[month %in% c(m, m-1), var])]
}
dt[, unique(res), by = month]
   month V1
1:     7 NA
2:     8 17
3:     9 33
4:    10 64
5:    11 82

# one of the things I tried
dt[, res := NULL]
lw <- dt[, .N, by = month][, N]
lw <- as.list(lw[-1] + lw[-length(lw)])
dt[, rollapplyr(var, width = lw, mean, fill = NA), by = month]

标签: rdata.tablezoo

解决方案


推荐阅读