【发布时间】:2020-10-07 14:49:44
【问题描述】:
背景/示例
大家好,
我正在尝试使用 data.table 中的现有列来计算新列。但是,这些列依赖于前一行的值。例如,说我的列 Rt = At + Bt + Rt-1。我有两列组成我的密钥,scenario 和 t。我一直在尝试这样做:
当前解决方案:
for(i in 1:maxScenario){
for(j in 2:nrow(dt)) {
dt[scenario == i & t == j, "R"] <- dt[scenario == i & t == j - 1, "R"]
+ dt[scenario == i & t == j, "A"] + dt[scenario == i & t == j, "B"]
} # end for loop for t
} # end for loop for scenario
这里的区别是,在“j - 1 而不是 j for R 来检索上一行的值。
问题
我意识到这会增加大量计算时间,并且是一种非常粗略的方法。 data.table 包中是否有更好的方法来执行此操作?我曾尝试使用 shift() 但在那里遇到了问题。使用 shift() 不会“重新计算”基于 A 和 B 的列。
我曾考虑使用递归公式,但我不确定这会对效率和运行时间产生什么影响。理想情况下,我希望运行大约 10 万个场景,并且需要在随机场景完成后进行这些计算。
谢谢!
编辑:示例
这是一个小例子的尝试。每行的 R 值取决于前一行的值。
t R A B
1 0 1 2
2 3 2 3
3 8 2 5
4 15 8 5
5 28 10 8
编辑 2:进一步说明
我终于能够将我的实际问题函数转化为代数:
Rt = λ * Pt + λ * Rt-1 - min{λ * Pt + λ * Rt-1, Dt} - A(t) * max{λ * Pt + λ * Rt-1 - Dt - Mt, 0} 其中 Pt 、Dt 和 Mt 是其他已知列,A(t) 是指示函数,当 t % 4 为 != 0 时返回 0,否则返回 1。
有没有办法将 shift() 和 cumsum() 与这样的嵌套方程一起使用?
【问题讨论】:
-
这个问题可以通过一个小例子稍微改进(比如 6 行 data.frame 和预期的输出)。事实上,即使问题表述得很好,也不是简单地举个例子。
标签: r performance for-loop recursion data.table