当每个计算值取决于先前值时,如何使用apply

问题描述 投票:1回答:1

我有3列:

  1. 分期付款
  2. 利益
  3. 曝光

第一排是这样的

分期付款利息风险

0          0        1000

第一行的分期付款为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循环。所以如果可能的话,我需要像申请或更快的方法

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

r for-loop apply sapply
1个回答
2
投票

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

<不幸的是,我不太确定如何在这里的SO Markdown中渲染LaTeX。对不起,演示文稿。 >

让L开始贷款金额,我是分期付款,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。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.