微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我编写的代码看起来像这样 - 对于 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 举报,一经查实,本站将立刻删除。