减少滚动产品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

使用带有data.table的滚动功能

滚动连接R中的data.table

在data.table R中滚动连接

在列表中定位产品并增加/减少其数量

使用 data.table 包滚动平均值到 R 中的多个变量