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

R语言将summary()统计结果转换为纯数值格式data.table的实现方法

R中将summary输出转换为纯数值data.table的实现方法

问题背景

执行summary(my_data)后得到如下统计结果:

year         quarter         employed         newhires       separations      jobscreated     jobsdestroyed  
 Min.   :1990   Min.   :1.000   Min.   :  6976   Min.   :  2321   Min.   :  1922   Min.   :  1091   Min.   :  520  
 1st Qu.:2000   1st Qu.:2.000   1st Qu.: 28049   1st Qu.: 16858   1st Qu.: 13912   1st Qu.:  6595   1st Qu.: 3862  
 Median :2003   Median :3.000   Median : 64836   Median : 39188   Median : 32018   Median : 14148   Median : 7727  
 Mean   :2003   Mean   :2.509   Mean   : 94468   Mean   : 59336   Mean   : 48973   Mean   : 22036   Mean   :11843  
 3rd Qu.:2007   3rd Qu.:4.000   3rd Qu.:121905   3rd Qu.: 75960   3rd Qu.: 61976   3rd Qu.: 26829   3rd Qu.:14993  
 Max.   :2010   Max.   :4.000   Max.   :571419   Max.   :448423   Max.   :391454   Max.   :166022   Max.   :80338  
                                                 NA's   :49                        NA's   :49       NA's   :49     

需求目标

需要将上述输出转换为指定格式的data.table,要求:

  • 所有单元格仅保留最小值、第一四分位数、中位数、均值、第三四分位数、最大值、缺失值数量的原始数值
  • 统计指标名称作为行名
    目标格式示意:
year         quarter         employed         newhires       separations      jobscreated     jobsdestroyed  
 Min.      
 1st Qu.   
 Median    
 Mean     
 3rd Qu.   
 Max.            
 NA's          

现有问题

使用如下代码转换时,输出的每个单元格都附带了Min.、1st Qu.等前缀标签,无法得到纯数值:

data.frame(unclass(summary(my_data)), check.names = FALSE, stringsAsFactors = FALSE)

当前错误输出效果:

year         quarter         employed         newhires      separations      jobscreated   jobsdestroyed
X   Min.   :1990   Min.   :1.000   Min.   :  6976   Min.   :  2321   Min.   :  1922   Min.   :  1091   Min.   :  520  
X.1 1st Qu.:2000   1st Qu.:2.000   1st Qu.: 28049   1st Qu.: 16858   1st Qu.: 13912   1st Qu.:  6595   1st Qu.: 3862  
X.2 Median :2003   Median :3.000   Median : 64836   Median : 39188   Median : 32018   Median : 14148   Median : 7727  
X.3 Mean   :2003   Mean   :2.509   Mean   : 94468   Mean   : 59336   Mean   : 48973   Mean   : 22036   Mean   :11843  
X.4 3rd Qu.:2007   3rd Qu.:4.000   3rd Qu.:121905   3rd Qu.: 75960   3rd Qu.: 61976   3rd Qu.: 26829   3rd Qu.:14993  
X.5 Max.   :2010   Max.   :4.000   Max.   :571419   Max.   :448423   Max.   :391454   Max.   :166022   Max.   :80338  
X.6           <NA>            <NA>             <NA>     NA's   :49               <NA>     NA's   :49      NA's   :49  

解决方案

方案1:直接基于summary()结果生成目标表格(推荐,无需文本清洗)

直接从原始数据计算统计量,避免后续清洗步骤,代码如下:

library(data.table)
# 计算核心统计量(最小值、1/4分位、中位数、均值、3/4分位、最大值)
sum_dt <- as.data.table(t(apply(my_data, 2, summary, na.rm = TRUE)), keep.rownames = "字段名")
# 补充缺失值计数行
na_count <- colSums(is.na(my_data))
sum_dt <- rbind(sum_dt, data.table(字段名 = "NA's", as.list(na_count)))
# 若需要统计指标作为行名,执行以下代码:
# sum_dt <- transpose(sum_dt, keep.names = "统计指标", make.names = "字段名")

方案2:对现有带标签的输出做文本清洗提取数值

如果已经生成了带标签的中间结果,可以用正则表达式提取冒号后的数值,代码如下:

library(data.table)
library(stringr)
# 假设带标签的中间结果存储在raw_sum_df中
raw_sum_df <- data.frame(unclass(summary(my_data)), check.names = FALSE, stringsAsFactors = FALSE)
# 逐列提取冒号后的数值
clean_dt <- as.data.table(lapply(raw_sum_df, function(x) {
  as.numeric(str_extract(x, "(?<=:)[\\d.]+"))
}))
# 补充行名与缺失值计数
rownames(clean_dt) <- c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.", "NA's")
clean_dt["NA's", ] <- colSums(is.na(my_data))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:36:08