我有以下问题,如果可能的话,我想用 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的结果似乎是错误的。