R语言使用data.table按年份分组转置生成双分组列描述性统计量表
你原有代码的问题在于未按Year分组计算,也没有将多指标的统计结果转换为要求的长表结构。以下是适配需求的data.table实现,支持后续快速扩展百分位等统计指标:
library(data.table) # 定义需要计算统计量的变量 stats_vars <- c("Length", "Weight", "Age") # 按Year分组计算所有统计量,后续新增指标直接在下方list中添加即可 dt_stats <- dt[, lapply(.SD, function(x) list( N = .N, Min = min(x, na.rm = TRUE), Mean = round(mean(x, na.rm = TRUE), 2), Max = max(x, na.rm = TRUE), P99 = quantile(x, 0.99, na.rm = TRUE) # 不需要可删除,新增其他统计项直接加在这里 )), by = Year, .SDcols = stats_vars] # 宽表转长表,匹配要求的输出结构 dt_new <- melt(dt_stats, id.vars = "Year", measure.vars = patterns(N = "N", Min = "Min", Mean = "Mean", Max = "Max", P99 = "P99"), variable.name = "Variable", value.name = c("Number of observations", "Min", "Mean", "Max", "P99")) # 替换变量名、按要求排序 dt_new[, Variable := stats_vars[Variable]] setorder(dt_new, Variable, Year)
说明
- 注意你原有代码中写的
Width应为样例表中的Weight,替换后即可正常运行 - 扩展统计指标只需做两处修改:第一步的计算逻辑list里新增对应计算函数,第二步melt的
measure.vars和value.name里新增对应字段即可,不需要修改其他逻辑 - 全程使用data.table原生语法,处理大数据量时效率远高于tidyverse系列函数
内容的提问来源于stack exchange,提问作者Calle
相关产品推荐
相关产品推荐

