减少滚动产品data.table
Posted
技术标签:
【中文标题】减少滚动产品data.table【英文标题】:Reducing rolling product data.table 【发布时间】:2021-11-29 22:52:07 【问题描述】:我想使用data.table
在我的小组中获得一个减少滚动产品。也就是说,下面数据集tst
中的第一行将是组 A 中所有 4 个值观察值和 orderVal(1:4) 的乘积。第二个是 orderVal 2:4,第三个是 3:4,最后一个是 4:4,以此类推所有 k 组。我可以使用 for 循环来做到这一点,但我知道这可能只使用 data.table 可以做得更干净、更有效。
下面的可重现代码:
require(data.table)
tst <- data.table(grp = c(rep("A", 4), rep("B",4)),
orderVal = c(rep(seq(1,4),2)),
val = c(rep(1.4, 4), rep(1.5, 4)))
【问题讨论】:
【参考方案1】:您可以使用Reduce
,带有accumulate=TRUE
选项:
tst[order(grp,-orderVal),prod:=Reduce(`*`,val,accumulate=T),by=grp][]
grp orderVal val prod
1: A 1 1.4 3.8416
2: A 2 1.4 2.7440
3: A 3 1.4 1.9600
4: A 4 1.4 1.4000
5: B 1 1.5 5.0625
6: B 2 1.5 3.3750
7: B 3 1.5 2.2500
8: B 4 1.5 1.5000
【讨论】:
谢谢——这几乎就是我想要的,只是倒过来了。我可能还不够清楚,我想以另一种方式获得产品。即 orderval 1 和 grp A 应该是 prod = 3.8416,orderVal 2 应该是 prod = 2.7440,依此类推。所以它应该从最高到最低(在这种情况下) 谢谢,我没有正确阅读您的帖子。查看我的编辑 验证后进一步简化。以上是关于减少滚动产品data.table的主要内容,如果未能解决你的问题,请参考以下文章
R语言data.table进行滚动数据连接,滚动联接通常用于分析涉及时间的数据实战(动画说明滚动数据连接的形式):rolling joins data.table in R