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

R语言实现多条件累积求和:如何生成目标累积列?

解决连续日期分组累计的问题

看起来你想要的是把连续的日期(包括同一天的重复记录)归为同一组,然后对这些组进行累计编号得到exp_cumsum_col。你的现有代码存在几个问题:列名不匹配、逻辑判断错误,还有dplyr语法使用不当,我来帮你修正并给出正确解法。

问题分析

先看你期望的结果规律:

  • 相同日期或连续的日期(比如14→15→16→17)会被归为同一个组,每次日期断开(比如3→9,11→14)时,组号就加1。

正确代码实现

我们可以用dplyr的lag()函数判断当前日期和前一个日期的连续性,再通过cumsum()累计新组的标记:

library(dplyr)

# 你的原始数据框
rd <- data.frame( 
  Customer = rep("A",15), 
  date_num = c(3,3,9,11,14,14,15,16,17,20,21,27,28,29,31), 
  exp_cumsum_col = c(1,1,2,3,4,4,4,4,4,5,5,6,6,6,7)
)

# 生成目标列
rd <- rd %>%
  group_by(Customer) %>% # 注意列名是大写的Customer,和你的数据框一致
  mutate(
    # 标记新组:第一行默认是新组;如果当前日期和前一个既不相同也不连续,标记为新组
    new_group = case_when(
      row_number() == 1 ~ 1,
      date_num != lag(date_num) & date_num != lag(date_num) + 1 ~ 1,
      TRUE ~ 0
    ),
    # 累计新组标记得到最终的组号
    exp_cumsum_col = cumsum(new_group)
  ) %>%
  select(-new_group) # 移除中间辅助列

# 查看结果
print(rd)

运行这段代码后,得到的exp_cumsum_col就和你期望的完全一致了。

你的原始代码问题说明

  1. 列名不匹配:你用了group_by(customer),但数据框里的列是Customer(大写C),导致分组没有生效;
  2. 语法错误:row_number(ifelse(...))的用法不正确,row_number()不需要传入这样的条件参数;
  3. 逻辑错误:你尝试用date_num[i]==date_num[i+1]来判断,但在dplyr的mutate中不能直接用索引访问下一行,而且这个逻辑只判断了同一天的情况,没有处理连续日期(比如14→15)的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:11:14