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

R语言DataFrame按category分组计算滚动累加和 如何引用分组历史值

解决方法

你要实现的需求核心是自定义分组的滚动累计求和,不需要写复杂的for循环,只需要先将P1/P2/P3统一归为同一个分组、Opponent单独为一组,之后直接按分组计算Value的累计和即可,代码实现非常简洁。

1. dplyr 实现

library(dplyr)

# 赋值Value+计算累计和一步完成
result <- smallerDF %>%
  mutate(
    # 按Event类型统一赋值Value,替代多个if判断
    Value = case_when(
      Event == "Good Pass" ~ 2,
      Event == "Bad Pass" ~ -2,
      Event == "Intercepted Pass" ~ 1,
      Event == "Turnover" ~ -3
    ),
    # 自定义分组:P系列归为同一组,Opponent单独分组
    calc_group = if_else(category == "Opponent", "Opponent", "Player")
  ) %>%
  # 按自定义分组计算滚动累计和
  group_by(calc_group) %>%
  mutate(`Score Sum` = cumsum(Value)) %>%
  ungroup() %>%
  # 移除辅助计算的分组列,保留原始列结构
  select(-calc_group)

2. data.table 实现

如果你偏好使用data.table,实现逻辑完全一致:

library(data.table)
dt <- as.data.table(smallerDF)

# 赋值Value
dt[, Value := fcase(
  Event == "Good Pass", 2,
  Event == "Bad Pass", -2,
  Event == "Intercepted Pass", 1,
  Event == "Turnover", -3
)]
# 新增自定义分组列
dt[, calc_group := fifelse(category == "Opponent", "Opponent", "Player")]
# 按分组计算累计和
dt[, `Score Sum` := cumsum(Value), by = calc_group]
# 删除辅助列
dt[, calc_group := NULL]

逻辑说明

你之前的for循环只判断了上一行是否为同组,当同组行中间间隔了其他分组的行时,就无法获取到同组上一次的累计值。而按自定义分组调用cumsum时,会自动按照数据的行顺序,仅对当前分组内的所有行做累加,自动跳过其他分组的行,完全匹配你的需求,运行后得到的结果和你给出的预期结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:03:00