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

