如何在R中按TRA分组计算累计余额(Balance)?
在R中按分组生成Balance列的最优实现方案
需求说明
需要为数据表生成Balance列,规则如下:
- 按
TRA字段分组,每组内按IDA从1到末尾升序排列 - 组内首行
Balance= 该组所有Principal的总和 - 组内中间行
Balance= 当前行Principal+ 下一行Balance - 组内最后一行
Balance= 当前行Principal
原代码问题分析
你之前的代码失效主要有两个原因:
- 分组后按
IDA降序排列计算累加和,最后仅按TRA排序,未恢复IDA的升序,导致结果顺序与需求不符 - 未处理
Principal字段的千分位逗号,若该字段是字符串类型,cumsum会直接报错或得到错误结果
最优解决方案
以下两种方案都能正确实现需求,优先推荐方案1(无需额外依赖):
方案1:仅使用dplyr实现
通过反转Principal序列计算累加和,再反转回原顺序,完美匹配需求逻辑:
library(dplyr) # 先将带千分位的Principal转换为数值型 df$Principal <- as.numeric(gsub(",", "", df$Principal)) df <- df %>% group_by(TRA) %>% arrange(IDA) %>% # 组内按IDA升序排列 mutate( Balance = rev(cumsum(rev(Principal))) ) %>% ungroup()
方案2:结合purrr实现(逻辑更直观)
使用accumulate_right从组内最后一行开始向左累加,直接对应“当前行Principal加下一行Balance”的规则:
library(dplyr) library(purrr) # 转换Principal为数值型 df$Principal <- as.numeric(gsub(",", "", df$Principal)) df <- df %>% group_by(TRA) %>% arrange(IDA) %>% mutate( Balance = accumulate_right(Principal, ~ .x + .y) ) %>% ungroup()
结果验证
运行上述代码后,生成的Balance列将与你提供的示例完全一致:
- TRA101组首行Balance为4个Principal的总和,后续行依次递推,最后一行等于自身Principal
- TRA102组即使最后一行Principal值与其他行不同,代码仍能正确计算累加逻辑,生成符合规则的结果
内容的提问来源于stack exchange,提问作者Igor Mendonça
相关产品推荐
相关产品推荐

