r - 在没有for循环的情况下按组获取重叠平均值(动物园,data.table)
问题描述
我有一个data.table
时间序列,并试图计算重叠时间间隔上的几个聚合,例如,在二月,我想获得一月和二月、三月-二月和三月等数据的平均值。
我可以使用 for 循环来计算这个,但由于我data.table
包含超过 300 000 行和几个变量,我想知道是否有更有效/优雅的方法来实现这一点。我尝试以各种方式rollapply
从zoo
包中使用,但没有得到预期的结果。
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]
解决方案
推荐阅读
- javascript - 异步函数中的 setState
- workflow - 如何从正在运行的 Snakemake 工作流程中可靠地获取状态信息?
- flutter - Flutter:如何启用通知声音
- testing - Geb - 不起作用 attr。必需(常规测试)
- html - 增量值有效,但不适用于附加的 HTML
- c# - 在 ValidatesOnExceptions UI 未更新
- android - 如何在android studio的exoplayer中从单视场显示立体?
- python - Rumps接口到Tkinter接口python错误
- docker - Docker - 检索具有 CLSID 的组件的 COM 类工厂
- unit-testing - CaseComment 对象上的触发器没有覆盖