求助:使用tidyverse/mutate计算存款账户余额,适配零投资场景
问题分析与解决方案
原代码的核心问题在于复利计算逻辑错误,具体表现为:
- 在
rowwise()环境下使用cumsum(planned_investments)会计算整个列的累积和,而非当前年份及之前的投入累积,导致每笔投入的复利次数匹配错误 - 投入资金的复利幂次计算逻辑偏差,错误地将累积投入乘以递减的高次幂,导致后续无投入年份的余额计算异常
正确实现方案(适配无投入场景)
使用tidyverse中的purrr::accumulate函数实现逐期余额计算,无需循环,且完美适配计划投入为0的场景:
library(tidyverse) initial_investment <- 22950 rate <- 0.015 overview_invests <- tibble(id = 1:25, planned_investments = c(rep(1000, 20), rep(0,5))) %>% mutate( # 逐期计算年末余额:上一年余额 + 当年投入 → 年末计息 balance = accumulate(planned_investments, .init = initial_investment, ~ (.x + .y) * (1 + rate))[-1] )
逻辑说明
accumulate以初始存款initial_investment为起始值,逐行处理planned_investments- 每一期的计算规则:
- 上一年的账户余额 + 当年的计划投入
- 对上述总额按年利率计算年末利息,得到当期年末余额
[-1]用于移除初始的initial_investment值,确保余额序列与年份一一对应
当后续年份计划投入为0时,计算逻辑自动退化为上一年余额复利增长,完全符合实际存款计息规则。
内容的提问来源于stack exchange,提问作者Junk Natalia
相关产品推荐
相关产品推荐

