R Data.table按列分组逐行应用求和函数的高效实现方案
高效实现方案
核心思路是完全避免转置操作,先按分组提取对应列名,直接使用向量化行运算完成聚合,性能远高于两次转置的方案,尤其适合大型数据集。
方案1:求和场景(最优性能)
针对你当前的求和需求,使用R内置高度优化的rowSums函数实现,无额外内存拷贝开销:
library(data.table) # 示例数据 data <- data.table(C1=rep(1,5),C2=rep(2,5),C3=rep(1,5),C4=rep(2,5)) group <- data.table(Sample=c("C1","C2","C3","C4"),Group = c("X","Y","X","Y")) # 按分组拆分得到每组对应的列名列表 group_cols <- split(group$Sample, group$Group) # 直接对每组列计算行和,生成结果表 res <- data[, lapply(group_cols, function(cols) rowSums(.SD[, cols, with = FALSE]))]
运行后res就是你需要的结果:
X Y 1: 2 4 2: 2 4 3: 2 4 4: 2 4 5: 2 4
方案2:通用场景(支持任意逐行聚合函数)
如果需要应用sum之外的自定义逐行处理函数,可以使用灵活的通用写法:
# 可替换为任意你需要的自定义逐行函数 custom_agg <- function(row_values) sum(row_values) res <- data.table( lapply(group_cols, function(cols) { apply(data[, cols, with = FALSE], 1, custom_agg) }) )
如果你的自定义函数支持向量化操作,优先替换apply为对应向量化实现,性能会有数十倍提升。
内容的提问来源于stack exchange,提问作者nerdyaswild
相关产品推荐
相关产品推荐

