如何在R data.table中按分组计算排除当前行的目标字段平均值
解决方案
你写的聚合逻辑只差一步即可实现需求,直接在计算中引用b即可,完整代码如下:
dt[, avg2 := (sum(b) - b)/(.N - 1), by = a]
实现原理
- data.table按
a分组后,b代表当前分组内所有行的b值组成的向量,sum(b)是当前组的b列总和(标量),sum(b) - b会自动广播计算,得到组内每一行排除自身b值后的总和 .N是data.table分组内置变量,代表当前分组的总行数,.N - 1就是排除当前行后的有效样本量- 使用
:=运算符可以直接在原数据表上新增avg2字段,不需要额外赋值拷贝,性能更高
完整测试示例
你可以运行下方代码验证结果和预期一致:
library(data.table) # 构造示例数据表 dt <- data.table( a = c(1, 1, 1, 2, 2), b = c(7, 0, 2, 1, 3) ) # 分组计算avg和avg2 dt[, `:=`( avg = mean(b), avg2 = round((sum(b) - b)/(.N - 1), 2) ), by = a] # 输出结果 print(dt)
内容的提问来源于stack exchange,提问作者pendermath
相关产品推荐
相关产品推荐

