R中顺序计算步骤的矢量化



我有以下问题,如果可能的话,我想用 data.table 在 R 中进行矢量化。由于 R 在 for 循环中相当慢,我认为在我的情况下矢量化是必须的(超过 500 个观察(。

下面我展示了一个我想矢量化的虚拟示例。请考虑以下代码:

library(data.table)
test <- data.table(Person = c("A", "B"),
Interest = c(0.02, 0.03),
Principal = c(100, 200),
Duration = c(3, 10),
Deduction = c(2, 3))

在这里,我想生成下表,其中每个计算取决于该人的两个属性和之前的计算结果(从本金金额开始(。

所以对于人 A,我会得到: 100, (100 - 2 (扣除(( * (1 + 0.02 (利息((。这将导致以下系列: 100, 99.96, 99.9192, 99.87758 表示周期 0、1、2、3。

对于人 B 来说,持续时间有点长,即 10 个,所以我会得到以下系列,具有人 B 的属性:

200, 200.94, 201.8988, 202.876776, 203.8743115, 204.8917978, 205.9296337,206.9882264, 208.0679909, 209.1693507 210.2927377

如果两个序列都在一个表中,因此最终表的长度为 2 乘以 10,当持续时间小于输入表中出现的最大持续时间时,所有其他空格由 NA 填充。

主要问题仍然是矢量化,我不确定如何使用 R 中的 data.table 对此进行矢量化。

有一个封闭式解决方案。

res = test[, .(
t = 0:Duration, 
v = Principal*(1+Interest)^(0:Duration) - Deduction*cumsum(c(0, (1+Interest)^(1:Duration)))
), by=Person]
Person        V1
1:      A 100.00000
2:      A  99.96000
3:      A  99.91920
4:      A  99.87758
5:      B 200.00000
6:      B 202.91000
7:      B 205.90730
8:      B 208.99452
9:      B 212.17435
10:      B 215.44959
11:      B 218.82307
12:      B 222.29776
13:      B 225.87670
14:      B 229.56300
15:      B 233.35989

杂项评论:

  • 在讨论如何编码之前,您通常应该寻找这种翻译。

  • 要插入缺失值,有res[CJ(Person = Person, t = t, unique=TRUE), on=.(Person, t)].

  • 正如@Nicolas2指出的那样,你对人B的结果似乎是错误的。

最新更新