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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:12:57