You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展data.table的lapply代码实现分组多指标统计?

基于data.table和lapply实现多维度分组统计

原数据表dt_1

Category <- c('A','A','A','B','B','B','B','A','B','B')                       
Amount <- c(10,20,30,15,20,40, 50, 80,20,10)                     
ID <- c('x01','x01','x02','x03','x03','x04','x05','x06','x07','x08') 
dt_1 <- data.table(Category, Amount, ID) 
dt_1

目标输出表dt_2

Category <- c('A','B')
NumRecords <- c(4,6)
TotalAmount <- c(140,155)
CountUniqueID <- c(3,5)
dt_2 <- data.table(Category, NumRecords, TotalAmount, CountUniqueID)
dt_2

基于lapply的扩展实现代码

可以在j参数中结合lapply与自定义统计逻辑,一次性生成所有需要的统计列:

ColsBy <- c("Category")
dt_2 <- dt_1[, .(
  NumRecords = .N,
  TotalAmount = lapply(.SD, sum, na.rm=TRUE)[[1]],
  CountUniqueID = length(unique(ID))
), by = ColsBy, .SDcols = "Amount"]

代码说明

  • .N:直接获取每个分组的记录总数,对应NumRecords列
  • lapply(.SD, sum, na.rm=TRUE)[[1]]:通过.SD指定Amount列,用lapply求和后提取结果值,对应TotalAmount列
  • length(unique(ID)):统计分组内唯一ID的数量,对应CountUniqueID列

也可以把统计逻辑整合为列表形式,更贴合lapply的使用习惯:

ColsBy <- c("Category")
dt_2 <- dt_1[, c(
  .(NumRecords = .N),
  lapply(.SD, sum, na.rm=TRUE),
  .(CountUniqueID = length(unique(ID)))
), by = ColsBy, .SDcols = "Amount"]
# 重命名求和后的列,与目标表列名统一
setnames(dt_2, "Amount", "TotalAmount")

内容的提问来源于stack exchange,提问作者highbury

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:45:25