如何对data.table分组列内的值求乘积并返回结果行?
data.table分组求列值乘积的正确方法
你不需要用cumprod来计算分组乘积,直接用prod函数就能一步得到每组的总乘积,完全不用处理多余的行:
原始输入
dt = data.table(group = c(1,1,2,2), value = c(2,3,4,5))
正确实现代码
dt[, .(value = prod(value)), by = group]
输出结果
group value 1: 1 6 2: 2 20
为什么之前的方法有问题?
cumprod是计算累积乘积,会保留组内每一行的累积结果,所以才会出现多余的行。而prod直接计算组内所有值的总乘积,返回每组一行的结果,正好符合你的需求。
如果非要基于cumprod的结果处理(不推荐,多此一举),可以取每组的最后一行(因为累积乘积的最后一个值就是总乘积),代码如下:
dt[, new_value := cumprod(value), by = group][, .SD[.N], by = group][, c("new_value") := NULL]
内容的提问来源于stack exchange,提问作者Tessa
相关产品推荐
相关产品推荐

