如何对data.table列表按多条件聚合后执行rbind合并?
多data.table列表多条件批量聚合实现方案
- 采用两层嵌套
lapply遍历替代重复硬编码,输出结果列表的长度与原输入lst.DT完全一致。 - 第一步:预先定义所有需要遍历的分组字段,无需重复书写单字段聚合逻辑:
group_cols <- c("C1", "C2", "C3") - 第二步:执行批量计算逻辑:
- 外层遍历输入列表中的每一个data.table
- 内层对当前data.table,遍历所有分组字段完成单字段聚合
- 将同一个源data.table下的所有聚合结果通过
rbindlist自动列对齐合并,作为结果列表的单个元素
完整可运行代码:
res_lst <- lapply(lst.DT, function(current_dt) { # 遍历所有分组条件,生成单组聚合结果的列表 agg_parts <- lapply(group_cols, function(by_col) { current_dt[, .(new = sum(V4 / V5)), by = by_col] }) # 合并当前源DT对应的所有聚合块,列自动对齐 rbindlist(agg_parts) }) - 结果校验:
res_lst的元素个数与原lst.DT完全相等,第i个元素与手动拼接得到的resi计算结果完全等价。
可选优化:如果合并后需要避免不同分组字段取值混叠、需要溯源每行聚合结果对应的分组类型,可修改内层聚合逻辑,统一列名并新增标识列:
agg_parts <- lapply(group_cols, function(by_col) { current_dt[, .(group_var = by_col, new = sum(V4 / V5)), by = .(group_val = get(by_col))] })
内容的提问来源于stack exchange,提问作者Discus23
相关产品推荐
相关产品推荐

