R

时间:2018-09-27 10:53:17

标签: r data.table

我有以下问题,如果可能的话,我想使用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将其矢量化。

1 个答案:

答案 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人的结果似乎是错误的。