基于多条件重置的分组累积求和实现(R语言dplyr方案)
实现多条件重置的分组累积求和功能
针对你需要按id分组,对amount和count字段进行累积求和,且当累积金额≥10且累积计数≥3时重置累积值为0,并新增condition_met标记满足条件行的需求,这里给出基于dplyr+purrr的解决方案:
数据样本
先确认你提供的原始测试数据:
df <- data.frame( date = as.Date(c("2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01", "2020-06-01", "2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01", "2020-06-01", "2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01", "2020-06-01")), id = c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C"), amount = c(1, 9, 5, 5, 6, 2, 10, 4, 8, 10, 6, 5, 5, 1, 6, 5, 5, 5), count = c(0, 2, 5, 4, 5, 1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 1, 0) )
核心解决方案
之前的方案仅单独判断单个变量的重置条件,现在我们需要同时跟踪两个累积值的状态,因此将amount和count绑定为列表,通过accumulate同步处理两者的累积逻辑:
library(dplyr) library(purrr) result_df <- df %>% group_by(id) %>% mutate( # 同步累积amount和count,返回每一步的累积结果列表 cum_vals = accumulate( .x = map2(amount, count, ~list(amt = .x, cnt = .y)), .f = function(prev, curr) { # 判断上一步累积值是否同时满足双条件 if (prev$amt >= 10 && prev$cnt >= 3) { # 满足条件则重置为当前行的值 curr } else { # 不满足则继续累加 list(amt = prev$amt + curr$amt, cnt = prev$cnt + curr$cnt) } } ), # 从累积列表中提取单独的累积字段 amount_cumsum = map_dbl(cum_vals, ~.x$amt), count_cumsum = map_dbl(cum_vals, ~.x$cnt), # 标记当前行是否满足双条件 condition_met = as.integer(amount_cumsum >= 10 & count_cumsum >= 3) ) %>% # 移除中间临时列 select(-cum_vals) %>% ungroup()
结果验证
运行上述代码后,输出的amount_cumsum、count_cumsum和condition_met列完全匹配你提供的期望结果。你可以通过print(result_df)查看完整结果。
逻辑说明
- 用
map2将每行的amount和count打包为列表,确保accumulate能同步跟踪两个变量的累积状态; - 在累积函数中,每次判断上一步的累积值是否同时满足双条件:满足则重置为当前行的值,不满足则继续累加;
- 最后从累积列表中拆分出单独字段,并生成条件标记列。
内容的提问来源于stack exchange,提问作者roboes
相关产品推荐
相关产品推荐

