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

如何在R中按TRA分组计算累计余额(Balance)?

在R中按分组生成Balance列的最优实现方案

需求说明

需要为数据表生成Balance列,规则如下:

  • 按TRA字段分组,每组内按IDA从1到末尾升序排列
  • 组内首行Balance = 该组所有Principal的总和
  • 组内中间行Balance = 当前行Principal + 下一行Balance
  • 组内最后一行Balance = 当前行Principal

原代码问题分析

你之前的代码失效主要有两个原因:

  1. 分组后按IDA降序排列计算累加和,最后仅按TRA排序,未恢复IDA的升序,导致结果顺序与需求不符
  2. 未处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:25:36