减少轧制产品 data.table

Reducing rolling product data.table

我想在我的小组中使用 data.table 获得一个减速轧制产品。也就是说,下面数据集 tst 中的第一行将是 A 组和 orderVal(1:4) 中所有 4 个值观察值的乘积。第二个是 orderVal 2:4,第三个是 3:4,最后一个是 4:4,依此类推。我可以用 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)))

您可以使用 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