在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
相关产品推荐
相关产品推荐

