如何在R的data.table中按列输出分位数等汇总统计结果?
用data.table直接生成带分位数列的汇总表
你可以通过合并基础统计量的list和分位数的list,在一次汇总操作中直接得到目标格式,不需要拆分后再合并:
library(data.table) # 创建示例数据 dt <- data.table(ID = rep(1:3, each = 100), val = rnorm(300, 100, sd = 20)) # 定义需要的分位数 percs <- c(0.05, 0.10, 0.50, 0.75, 0.90, 0.95) # 一次汇总得到所有列 dt[, c( .(mean = mean(val, na.rm = TRUE), Median = median(val, na.rm = TRUE), min = min(val, na.rm = TRUE), max = max(val, na.rm = TRUE)), as.list(quantile(val, probs = percs, na.rm = TRUE)) ), by = ID]
优化:自定义分位数列名
如果想让分位数列的名字更直观,可以先给分位数向量命名:
names(percs) <- paste0("p", percs * 100) # 生成p5、p10这类清晰的列名 dt[, c( .(mean = mean(val, na.rm = TRUE), Median = median(val, na.rm = TRUE), min = min(val, na.rm = TRUE), max = max(val, na.rm = TRUE)), as.list(quantile(val, probs = percs, na.rm = TRUE)) ), by = ID]
为什么最初的方法格式不对
你最初的写法里,把as.list(quantile(...))直接放在.()中,相当于把这个list作为一个嵌套元素传入,data.table会将嵌套的list展开为多行。而用c()将基础统计量的list和分位数的list合并成平级的list后,data.table会把每个元素都解析为单独的列,一次就能得到符合要求的宽表格式。
内容的提问来源于stack exchange,提问作者TBP
相关产品推荐
相关产品推荐

