我有以下问题,如果可能的话,我想使用data.table在R中进行向量化。由于使用for循环时R相当慢,因此我认为必须进行向量化(超过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
如果两个序列都在一个表中,则最终表的长度将是10的2倍,并且当持续时间小于输入表中出现的最大持续时间时,所有其他空格都由NA填充。
主要问题仍然是矢量化,我不确定如何使用R中的data.table将其矢量化。
答案 0 :(得分:2)
有一个封闭式解决方案。
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人的结果似乎是错误的。