You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中实现基于日历月份的滚动分组计算?

基于日历月份的滚动计算方案(适用于大规模R数据集)

针对你的需求——按company_id分组,基于month_id对过去3个月的日度数据执行计算(如均值、回归),而非基于行的滚动窗口,以下是两种高效实现方案,适配数千万行规模的数据集:

方法一:data.table(千万级数据首选)

data.table的底层C++实现能大幅提升处理速度,是超大规模数据集的最优选择:

步骤1:聚合到月度级别

先将日度数据按公司和月份聚合,减少数据量,降低后续计算负载:

library(data.table)

# 读入数据(替换为你的数据路径或现有数据对象)
dt <- fread("your_data.csv")

# 聚合每个公司每月的value总和与数据行数
monthly_dt <- dt[, .(total_value = sum(value), n = .N), by = .(company_id, month_id)]

步骤2:滚动计算过去3个月的均值

利用frollsum快速计算滚动总和,推导得到均值,不足3个月时自动返回NA:

# 按公司分组,计算过去3个月(含当前月)的滚动总和与行数
monthly_dt[, `:=`(
  rolling_total = frollsum(total_value, n = 3, align = "right", na.rm = FALSE),
  rolling_n = frollsum(n, n = 3, align = "right", na.rm = FALSE)
), by = company_id]

# 计算均值
monthly_dt[, 3m_mean := rolling_total / rolling_n]

# 提取最终结果
result <- monthly_dt[, .(month_id, company_id, 3m_mean)]

扩展到回归分析

如果需要对每个月的过去3个月日度数据执行回归(如value ~ date),可结合并行计算优化:

# 确保数据按公司和月份排序
dt <- dt[order(company_id, month_id)]

# 定义回归函数,返回斜率系数
run_monthly_reg <- function(company, target_month) {
  data_subset <- dt[company_id == company & month_id %between% c(target_month - 2, target_month)]
  # 数据量不足时返回NA
  if (nrow(data_subset) < 5) return(NA_real_)
  model <- lm(value ~ as.numeric(date), data = data_subset)
  coef(model)[["as.numeric(date)"]]
}

# 获取所有公司-月份组合
company_months <- dt[, unique(month_id), by = company_id]

# 并行计算(需加载future包)
library(future)
plan(multisession)
company_months[, reg_coef := future_lapply(.I, function(i) {
  run_monthly_reg(company_id[i], V1[i])
}), by = company_id]

方法二:dplyr + slider(语法简洁)

适合数据规模稍小或偏好tidyverse语法的场景:

library(dplyr)
library(slider)

# 聚合到月度级别
monthly_df <- dt %>%
  group_by(company_id, month_id) %>%
  summarise(total_value = sum(value), n = n(), .groups = "drop") %>%
  # 按公司分组并排序月份
  group_by(company_id) %>%
  arrange(month_id) %>%
  # 滚动计算过去3个月的总和,仅保留完整窗口结果
  mutate(
    rolling_total = slide_dbl(total_value, sum, .before = 2, .complete = TRUE),
    rolling_n = slide_dbl(n, sum, .before = 2, .complete = TRUE),
    3m_mean = rolling_total / rolling_n
  ) %>%
  select(month_id, company_id, 3m_mean)

方案优势

  • 聚合到月度级别将数据量压缩为原有的1/20~1/30,大幅降低计算负载
  • data.table的frollsum是C++实现,速度远快于纯R循环
  • 回归分析时用并行计算可进一步提升效率

内容的提问来源于stack exchange,提问作者datgoaltho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:09:51