【问题标题】:How to use apply when each calculated value depends on previous value当每个计算值都依赖于前一个值时如何使用 apply
【发布时间】:2019-02-11 07:58:33
【问题描述】:

我有 3 列:

  1. 分期付款

  2. 兴趣

  3. 曝光

第一行是这样的

分期利息曝光

0          0        1000

第 1 行的分期付款为 0,之后为固定数字。让它成为 100。

第 i 行的利息 = 0.5% * 第 (i-1) 行的曝光率

第i行曝光=第(i-1)行曝光-(第i行分期-第i行利息)

installment interest   exposure

0           0          1000
100         0.005*1000 1000-(100-5)

当前兴趣取决于先前的曝光,当前曝光取决于当前兴趣。这应该一直持续到曝光为 0。我已经使用 R 中的 for 循环完成了此操作。但是我的数据很大,我不想要 for环形。 所以如果可能的话,我需要类似 apply 甚至更快的方法

有没有其他方法可以在没有循环的情况下做到这一点。我正在寻找一个快速的过程。

【问题讨论】:

  • 看看dplyr::lag 还发布了一个可重复的示例(通过dput 提供的数据样本)与您的 for 循环,以便我们可以根据您的需要检查可能的结果。我很确定这可以通过矢量化方式处理。
  • 我认为在这种情况下,循环是最可能的方式。因为,新行的值取决于前一行。我猜 R 中的所有函数都适用于指定长度的向量或数据帧。或者换句话说,您必须编写每行执行的代码。因此,它需要循环遍历所有行

标签: r for-loop apply sapply


【解决方案1】:

看起来像贷款摊销,你可以在编码之前尝试创建一个公式。

设L为起始贷款金额,I为分期付款,r为利率。

在 n=0 期间,未偿还贷款金额为 L。

在 n=1 期间,未偿还贷款金额为 (1+r)*L - I。

在 n=2 期间,未偿还贷款金额为 (1+r)^2 * L - (1+r) * I - I。

在 n=3 期间,未偿还贷款金额为 (1+r)^3 * L - (1+r)^2 * I - (1+r) * I - I。

在第 n 期,未偿还贷款金额为 (1+r)^n * L - I * sum_{k=0}^{n-1} (1+r)^k。

之后,就是这样编码的问题:

amor <- function(L, r, I, nvec) {
    vapply(nvec, 
        function(n) {
            if (n < 1L) stop("n must be > 0.")
            L * (1+r)^n - I * sum((1+r)^(seq_len(n) -1L))
        },
        numeric(1))
}
amor(1000, r, 100, seq_len(12))

输出:

[1]  905.00000  809.52500  713.57262  617.14049  520.22619  422.82732  324.94146  226.56617  127.69900   28.33749  -71.52082 -171.87843

下一个要解决的问题是“这应该一直持续到曝光为 0”。您可以使用 n * I > L * (1+r)^n

近似
maxN <- round(uniroot(function(n) I*n - (1+r)^n*L, c(1, 1000))$root)

然后使用replace 将这些负数设置为0。

希望这会有所帮助。

【讨论】:

  • 您好,非常感谢。我会检查一下,让你知道它是否与我的结果匹配。我使用 PMT 函数计算分期付款金额,如果我使用该值进行摊销,我将始终以曝光 0 结束
  • 您好,希望您能回复。您的功能非常适合我尝试过的一些数据。曝光自然也会收敛到 0。但我有一个小问题。我也想处理分期金额不固定的情况,即固定本金、可变分期贷款。如何处理?
  • 如果你发布一个新的qn,你可能会得到其他人更快的回复。我现在不在电脑附近
猜你喜欢
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2017-06-19
相关资源
最近更新 更多