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

基于多条件重置的分组累积求和实现(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:12:31