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
相关产品推荐
相关产品推荐

