在不断地对前一行进行计算时,有没有办法让这段代码运行得更快? [转帖]

问题描述

我编写的代码看起来像这样 - 对于 id2>1,我希望 PRES_INVT 取列中的前一个值并添加 PRESCRIbed_DURATION 然后减去 disPENSED_DURATION,按 id1 和 id2 分组。 id1 被定义为这个人的唯一 id,而 id2 被定义为每个 id1 的行号。这是一个面板数据集。

b[,PRES_INVT := PRESCRIbed_DURATION-disPENSED_DURATION]

b[id2>1,PRES_INVT := b[.I-1,PRES_INVT]+PRESCRIbed_DURATION-disPENSED_DURATION,.(id1,id2)]

我想知道是否有人可以指导我如何使此运行更快? 我正在处理 64M 行,代码在 6 小时后仍在运行。

这是示例表:

id1 = c(1,1,2,2) id2 = c(1,3,4,5,5) date = c("2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-05","2020-01-06","2020-01-07","2020-01-08","2020-01-09","2020-01-10") PRESCRIbed_DURATION = c(42,32,30,0) disPENSED_DURATION = c(42,0) b = data.table(id1,id2,date,PRESCRIbed_DURATION,disPENSED_DURATION) 

这是预期的结果:

structure(list(id1 = c(1,2),id2 = c(1,5),date = c("2020-01-01","2020-01-10"),PRESCRIbed_DURATION = c(42,0),disPENSED_DURATION = c(38,31,29,PRES_INVT = c(4,1)),row.names = c(NA,-10L),class = c("data.table","data.frame"),.internal.selfref = <pointer: 0x7fd8155ead60>)

shift(PRES_INVT) 不起作用,因为在定义同一列时我似乎无法引用同一列,我一直只引用列中的第一行,所以我不得不使用索引 I 来查找行。另外,我不想为每个人的第 1 行(id2==1)更改任何内容,我只想更改每个人的第 2 行(id2>2)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)