使用cumsum结合mutate生成累计列异常,寻求解决方法
问题原因
你用group_by(count)后,cumsum(count)会在每个count值相同的分组内单独计算累计,而非按时间顺序做全局累加。比如:
- count=1的行(前6年)会被分到一组,累计到6;
- count=2的行(2016、2021、2022年)单独成组,累计结果是2、2、4;
- count=3的行(2017-2019、2023年)单独成组,累计结果是3、6、9、3;
这就导致你看到的“累计停止”和2023年结果异常的情况。
正确解决方法
你的需求是按时间顺序做全局累计,不需要分组,直接用mutate结合cumsum即可:
1. 单列实现
dat <- dat %>% mutate(CulmCount2 = cumsum(count))
运行后CulmCount2会和你用dat[,"CulmCount1"]<-cumsum(dat$count)得到的结果完全一致。
2. 多列批量处理(across实现)
如果有多个需要累计的列(比如count1、count2),用across批量处理,自定义新列名:
# 假设数据有count1、count2列,批量生成累计列 dat <- dat %>% mutate(across( c(count1, count2), # 指定要处理的列 cumsum, # 应用累计函数 .names = "Culm_{.col}" # 新列名格式:Culm_原列名 ))
也可以用列名匹配规则简化,比如处理所有以count开头的列:
dat <- dat %>% mutate(across( starts_with("count"), cumsum, .names = "Culm_{.col}" ))
内容的提问来源于stack exchange,提问作者reportertim
相关产品推荐
相关产品推荐

