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就和你期望的完全一致了。
你的原始代码问题说明
- 列名不匹配:你用了
group_by(customer),但数据框里的列是Customer(大写C),导致分组没有生效; - 语法错误:
row_number(ifelse(...))的用法不正确,row_number()不需要传入这样的条件参数; - 逻辑错误:你尝试用
date_num[i]==date_num[i+1]来判断,但在dplyr的mutate中不能直接用索引访问下一行,而且这个逻辑只判断了同一天的情况,没有处理连续日期(比如14→15)的场景。
内容的提问来源于stack exchange,提问作者Yogesh Kumar
相关产品推荐
相关产品推荐

