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

R语言中按ACCOUNT_ID分组引用前一行值计算贷款未结清余额的方法

R实现按账户分组的滚动贷款期末余额计算

注意:运行代码前必须确保数据集按ACCOUNT_ID、Fore_Cast_Horizon升序排列,否则计算顺序错误会导致结果偏差

方案1:tidyverse 简洁实现(推荐)

依赖dplyr做分组、purrr的迭代函数完成滚动计算,代码可读性高:

# 加载依赖包
library(tidyverse)

data1_result <- data1 %>%
  arrange(ACCOUNT_ID, Fore_Cast_Horizon) %>%
  group_by(ACCOUNT_ID) %>%
  mutate(
    Closing_Balance_cal = accumulate2(
      .x = Interest_Rate,
      .y = Instalment,
      .init = first(Account_Balance),
      .f = \(prev_bal, rate, instal) prev_bal * (1 + rate) - instal
    )[-1]
  ) %>%
  ungroup()

方案2:基础R实现(无需安装第三方包)

用原生循环和拆分函数完成计算,兼容性更强:

# 先对数据排序
data1 <- data1[order(data1$ACCOUNT_ID, data1$Fore_Cast_Horizon), ]
# 按账户ID拆分数据集
account_list <- split(data1, data1$ACCOUNT_ID)
# 遍历每个账户单独计算期末余额
data1$Closing_Balance_cal <- unlist(lapply(account_list, function(acc_df) {
  n <- nrow(acc_df)
  bal_res <- numeric(n)
  # 计算首期余额
  bal_res[1] <- acc_df$Account_Balance[1] * (1 + acc_df$Interest_Rate[1]) - acc_df$Instalment[1]
  # 计算后续各期余额
  if (n >= 2) {
    for (i in 2:n) {
      bal_res[i] <- bal_res[i-1] * (1 + acc_df$Interest_Rate[i]) - acc_df$Instalment[i]
    }
  }
  return(bal_res)
}))

两种方案计算结果均与你提供的样例Closing Balance列完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:54:05