R语言data.table如何基于自定义函数创建汇总统计表
data.table 等价实现方案
你原有的自定义统计函数可以直接复用,不需要修改,data.table原生语法就能实现完全一致的汇总效果,不需要依赖purrr等额外包,大数据量下性能远高于dplyr实现。
最简实现(和原dplyr输出完全对齐)
# 加载依赖、读入数据 library(data.table) library(mlbench) data(BostonHousing) setDT(BostonHousing) # 转为data.table对象,无内存拷贝开销 # 自定义统计函数,和原有写法完全一致,无需改动 fun_stats <- function(x) { min <- min(x, na.rm = TRUE) max <- max(x, na.rm = TRUE) mean <- mean(x, na.rm = TRUE) list(min = min, max = max, mean = mean) } # 核心计算逻辑 stats <- BostonHousing[, lapply(.SD, fun_stats), .SDcols = is.numeric ][, var := names(.SD)][, .(var, min, max, mean)]
逻辑说明
.SDcols = is.numeric等价于原dplyr写法中的select_if(is.numeric),自动筛选所有数值列作为计算子集lapply(.SD, fun_stats)等价于purrr::map(fun_stats),遍历所有选中的数值列应用自定义统计函数,data.table会自动将函数返回的列表结构展开为规范的多列格式- 最后补充
var列对应原写法中bind_rows(.id = "var")的变量名列,调整列顺序后输出的表结构、数值和原dplyr方案生成的结果完全一致
扩展性更强的长表写法
如果后续需要增加分组统计需求(比如按分类变量分组计算各数值列的统计值),可以用melt转长表的写法,改造成本极低:
stats <- melt( BostonHousing, measure.vars = names(which(sapply(BostonHousing, is.numeric))) )[, fun_stats(value), by = variable][, setnames(.SD, "variable", "var")]
如果后续需要给自定义函数加统计指标,比如中位数、标准差、分位数,只需要修改fun_stats的返回列表即可,外层计算逻辑不需要调整。
内容的提问来源于stack exchange,提问作者carl
相关产品推荐
相关产品推荐

