减少轧制产品 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
我想在我的小组中使用 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