如何使用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
相关产品推荐
相关产品推荐

