如何使用R实现投资每期期初与期末余额的循环计算?
解决R中投资余额递推计算的问题
错误原因分析
你原代码的核心问题是对lag()函数的用法错误:lag(Contribution, Contribution*Grow)中,lag()的第二个参数n要求是整数(表示滞后的期数),但你传入了一个数值向量,直接触发了报错。同时整个ifelse的逻辑也没有贴合"上期期末余额+当期投入"作为新期初的递推计算需求。
正确计算逻辑回顾
每期的计算规则:
- 第1期:期末余额 = 当期投入 × 当期增长率
- 第n期(n>1):期末余额 = (上期期末余额 + 当期投入) × 当期增长率
实现方法
方法1:基础R循环
适合新手理解的直观写法:
df <- data.frame(Contribution=c(100,100,110,110),Grow=c(1.05,0.95,1.1,0.925)) # 初始化期末余额列 df$End_Balance <- numeric(nrow(df)) # 计算第一期 df$End_Balance[1] <- df$Contribution[1] * df$Grow[1] # 循环计算后续期数 for(i in 2:nrow(df)){ df$End_Balance[i] <- (df$End_Balance[i-1] + df$Contribution[i]) * df$Grow[i] } print(df)
方法2:tidyverse风格(purrr::accumulate)
更符合管道流写法的方案,无需手动循环:
library(tidyverse) df <- data.frame(Contribution=c(100,100,110,110),Grow=c(1.05,0.95,1.1,0.925)) df <- df %>% mutate(End_Balance = accumulate2( .x = Contribution[-1], # 从第2期开始的投入 .y = Grow[-1], # 从第2期开始的增长率 .init = Contribution[1] * Grow[1], # 第1期的期末余额作为初始值 .f = function(last_end, current_contrib, current_grow) { (last_end + current_contrib) * current_grow } ) %>% unlist()) print(df)
运行结果
两种方法都会得到如下结果:
Contribution Grow End_Balance 1 100 1.050 105.0000 2 100 0.950 194.7500 3 110 1.100 335.2250 4 110 0.925 411.8331
内容的提问来源于stack exchange,提问作者JohnS
相关产品推荐
相关产品推荐

