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

在R中基于观测数计算滚动胜场并获取窗口起止日期

解决方案

要实现按球队计算最近5场比赛的滚动胜场总和,同时添加每个滚动窗口的起止日期,你需要用data.table的滚动窗口函数对每个分组内的每一行单独计算,而不是用dplyr::summarise(它会取整个分组的首尾日期,而非滚动窗口的)。

核心步骤

  • 将数据转换为data.table格式,便于高效处理滚动窗口操作;
  • 按team分组,对每个组分别计算三个指标:
    • 滚动胜场总和:用frollsum统计窗口内获胜场次;
    • 窗口起始日期:用frollapply提取每个滚动窗口的最早日期;
    • 窗口结束日期:用frollapply提取每个滚动窗口的最晚日期(即当前行的日期);
  • 确保所有滚动函数的align参数一致(默认"right",表示窗口包含当前行及前4行)。

完整代码

library(data.table)

# 转换为data.table格式
setDT(df)

# 分组计算滚动指标
df[, `:=`(
  roll_wins = frollsum(result == "win", n = 5, align = "right"),
  window_start = frollapply(date, n = 5, FUN = first, align = "right"),
  window_end = frollapply(date, n = 5, FUN = last, align = "right")
), by = team]

# 查看结果
print(df)

可选调整

如果希望仅当窗口包含满5场比赛时才计算,不足5场的行返回NA,可以给滚动函数添加fill = NA参数:

df[, `:=`(
  roll_wins = frollsum(result == "win", n = 5, align = "right", fill = NA),
  window_start = frollapply(date, n = 5, FUN = first, align = "right", fill = NA),
  window_end = frollapply(date, n = 5, FUN = last, align = "right", fill = NA)
), by = team]

原代码失效原因

你之前用dplyr::summarise时,first(date)和last(date)是取整个球队分组的首尾日期,而非每个滚动窗口的起止日期,因此无法得到预期的窗口范围。而data.table的分组操作会对每一行执行滚动计算,确保每个窗口对应正确的日期范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:05:59