如何扩展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
相关产品推荐
相关产品推荐

