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

R Markdown中如何将summary输出转为美观可编辑表格?

问题:将R中summary统计结果转为美观可编辑表格

问题背景

在R Markdown中处理ATT数据集时,尝试将summary()的统计结果转为美观可编辑表格,使用了以下代码:

ATT_STATS_Table <- ATT 

as.data.frame(apply(ATT_STATS_Table,2,summary)) %>% 
  kbl() %>% 
  kable_styling()

但输出不符合预期,仅显示字符型统计信息:

Flexion_Degrees Load_Direction  Load_N  Osteotomy_Type  PTS_Degrees ATT_ACL
Length  30  30  30  30  30  30
Class   character   character   character   character   character   character
Mode    character   character   character   character   character   

而summary(ATT)的正确输出应为:

Flexion_Degrees Load_Direction         Load_N      Osteotomy_Type    
 Min.   :15      Length:30          Min.   : 18.0   Length:30         
 1st Qu.:30      Class :character   1st Qu.:100.0   Class :character  
 Median :30      Mode  :character   Median :134.0   Mode  :character  
 Mean   :39                         Mean   :179.3                      
 3rd Qu.:30                         3rd Qu.:206.8                      
 Max.   :90                         Max.   :400.0                      
                                    NA's   :4                          
  PTS_Degrees        ATT_ACL     
 Min.   :-0.900   Min.   :0.600  
 1st Qu.: 0.000   1st Qu.:2.400  
 Median : 8.000   Median :3.800  
 Mean   : 6.427   Mean   :3.736  
 3rd Qu.:10.000   3rd Qu.:5.200  
 Max.   :16.300   Max.   :6.700  
                  NA's   :1      

可复现的数据集样本:

ATT_STATS_Table <- tibble::tribble(
  ~Flexion_Degrees, ~Load_Direction,              ~Load_N,  ~Osteotomy_Type, ~PTS_Degrees, ~ATT_ACL,
  30,               "Anterior",                   134,      "Native",        0,            5.5,
  90,               "Anterior",                   134,      "Native",        0,            4,
  30,               "Anterior",                   134,      "AOWO",          5,            5.8,
  90,               "Anterior",                   134,      "AOWO",          5,            4,
  30,               "Anterior",                   134,      "AOWO",          10,           5.7,
  90,               "Anterior",                   134,      "AOWO",          10,           3.8,
  30,               "Anterior",                   134,      "AOWO",          15,           5.2,
  90,               "Anterior",                   134,      "AOWO",          15,           3.1,
  15,               "UNLOADED",                   18,       "Native",        8,            0.6,
  15,               "UNLOADED",                   18,       "AOWO",          12.1,         2.1,
  15,               "UNLOADED",                   18,       "AOWO",          16.3,         3.2,
  15,               "Anterior",                   18,       "Native",        8,            NA_real_,
  15,               "Anterior",                   108,      "AOWO",          12.1,         1.4,
  15,               "Anterior",                   209,      "AOWO",          16.3,         6.7,
  30,               "Axial_Compression",          400,      "ACWO",          9.9,          3.8,
  30,               "Axial_Compression",          400,      "ACWO",          0,            2.354,
  30,               "Axial_Compression",          400,      "ACWO",          9.9,          6.339,
  30,               "Axial_Compression",          400,      "ACWO",          0,            2.649,
  30,               "Axial_Compression",          200,      "Native",        10,           1.7,
  30,               "Axial_Compression",          400,      "Native",        10,           3.7,
  30,               "Axial_Compression",          200,      "ACWO",          0,            1,
  30,               "Axial_Compression",          400,      "ACWO",          0,            2.4,
  30,               "Anterior",                   NA_real_, "Native",        10,           4.6,
  30,               "Anterior_Axial compression", NA_real_, "Native",        10,           4.7,
  30,               "Anterior",                   NA_real_, "ACWO",          0,            5.7,
  30,               "Anterior_Axial compression", NA_real_, "ACWO",          0,            6,
  30,               "Anterior",                   100,      "LCWO",          -0.9,         5,
  30,               "Anterior",                   100,      "MOWO",          1,            3.03,
  90,               "Anterior",                   100,      "LCWO",          -0.9,         1.675,
  90,               "Anterior",                   100,      "MOWO",          1,            2.587,
)

问题原因

apply()函数会将数据框转换为矩阵,而矩阵只能容纳单一数据类型。由于数据集中混合了数值型和字符型列,apply()会将所有列强制转换为字符型,导致最终只保留了字符列的summary信息(Length/Class/Mode),丢失了数值列的统计值。

解决方案

方案1:使用skimr包快速生成标准化统计表格

skimr包专门用于生成整洁的数据集统计摘要,支持直接输出为可美化的表格:

# 安装并加载包
install.packages("skimr")
library(skimr)
library(kableExtra)

# 生成统计摘要并转为美观表格
skim(ATT) %>%
  skim_to_wide() %>%
  kbl() %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))

方案2:手动处理summary结果,分类型整理

如果需要完全匹配summary()的输出格式,可以用purrr和dplyr手动提取并整理统计信息:

library(tidyverse)
library(kableExtra)

# 提取每列的summary结果,转为数据框
summary_list <- map(ATT, summary)

# 整理数值列和字符列的统计信息
stats_df <- map_dfr(summary_list, ~{
  if(is.numeric(.x)){
    tibble(
      Statistic = names(.x),
      Value = as.character(.x)
    )
  } else {
    tibble(
      Statistic = c("Length", "Class", "Mode"),
      Value = as.character(.x)
    )
  }
}, .id = "Variable") %>%
  pivot_wider(names_from = Variable, values_from = Value)

# 生成美化表格
stats_df %>%
  kbl() %>%
  kable_styling(bootstrap_options = c("striped", "bordered"), full_width = FALSE)

方案3:使用psych包的describe()函数

如果只关注数值列的详细统计,psych包的describe()函数更适合,输出直接为数据框:

install.packages("psych")
library(psych)
library(kableExtra)

# 提取数值列的统计信息
describe(ATT[, sapply(ATT, is.numeric)]) %>%
  kbl() %>%
  kable_styling(bootstrap_options = "striped")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:39:52