You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用data.table实现分组下的递减滚动乘积计算

data.table分组递减滚动乘积实现方案

你需要的分组内从当前行到组内最后一行的滚动乘积,可以通过data.table原生的分组操作结合rev()、cumprod()函数实现,无需循环,执行效率很高。

实现代码如下:

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)))
# 核心计算逻辑:按grp分组计算倒序累积乘积后反转
tst[, roll_prod := rev(cumprod(rev(val))), by = grp]

执行后得到的结果如下:

grp orderVal val roll_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

逻辑说明

  • 内层rev(val):将当前分组内的val列倒序排列
  • cumprod():计算倒序列的累积乘积,得到从原分组最后一行往前的累积结果
  • 外层rev():把累积乘积结果再反转,刚好对应原分组每行从当前位置到组末的乘积

如果原始数据没有提前按orderVal升序排序,需要先排序再计算,确保结果顺序正确:

tst[order(grp, orderVal), roll_prod := rev(cumprod(rev(val))), by = grp]

内容的提问来源于stack exchange,提问作者ErrantBard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:36:03