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

R Markdown提取summary函数输出至表格时无数值显示的问题

问题:summary输出转换为美观表格时丢失统计数值

我在R Markdown中尝试将summary()函数的输出转换为美观表格,但最终表格只显示变量类型信息(Length、Class、Mode),没有提取到实际的统计数值(如最小值、均值、中位数等)。

加载包与读取数据代码

library(tidyverse)
library(kableextra)
library(readxl)

ATT <- read_excel('E:/MY PROJECTS/OSTEOTOMY ACL/ATT.xlsx')

数据示例

Flexion_Degrees Load_Direction  Load_N  Osteotomy_Type  PTS_Degrees Paper   ATT_ACL
30              Anterior        134     Native          0           Nelitz  5.5
90              Anterior        134     Native          0           Nelitz  4
30              Anterior        134     AOWO            5           Nelitz  5.8
90              Anterior        134     AOWO            5           Nelitz  4

正常summary输出

执行summary(ATT)能得到包含统计数值的输出:

Flexion_Degrees Load_Direction         Load_N     
 Min.   :15      Length:30          Min.   : 18.0  
 1st Qu.:30      Class :character   1st Qu.:100.0  
 Median :30      Mode  :character   Median :134.0  
 Mean   :39                         Mean   :179.3  
 3rd Qu.:30                         3rd Qu.:206.8  
 Max.   :90                         Max.   :400.0

出错的代码与输出

执行以下代码后,表格仅显示类型信息:

ATT_STATS_Table <- ATT %>%  
  select(PTS_Degrees,Flexion_Degrees,ATT_ACL,Load_N)  

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

错误输出:

PTS_DegreesFlexion_DegreesATT_ACLLoad_NLength30303030ClasscharactercharactercharactercharacterModecharactercharactercharactercharacter

问题原因

你选中的PTS_Degrees、Flexion_Degrees、ATT_ACL列在数据中被识别为字符型(character),而summary()函数对字符型变量仅会返回Length(长度)、Class(类型)、Mode(存储模式)三类信息,不会计算数值统计量。从你正常的summary(ATT)输出也能看出:只有Load_N(数值型)有完整的统计数值,Flexion_Degrees虽然是数字但被识别成了字符型,所以只显示字符型的summary结果。


解决方案

方案1:转换数据类型后修复原代码

先将需要统计的列转换为数值型,再处理summary输出:

library(tidyverse)
library(kableextra)
library(readxl)

ATT <- read_excel('E:/MY PROJECTS/OSTEOTOMY ACL/ATT.xlsx')

# 将目标列转为数值型
ATT_STATS_Table <- ATT %>%  
  mutate(across(c(PTS_Degrees, Flexion_Degrees, ATT_ACL, Load_N), as.numeric)) %>%
  select(PTS_Degrees, Flexion_Degrees, ATT_ACL, Load_N)  

# 转置summary结果,让统计量作为行、变量作为列
as.data.frame(t(sapply(ATT_STATS_Table, summary))) %>% 
  kbl(col.names = c("最小值", "第一四分位数", "中位数", "均值", "第三四分位数", "最大值")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"))

方案2:用dplyr自定义统计量(更灵活)

如果需要指定特定统计指标,可以用dplyr的summarize和pivot函数整理格式:

ATT %>%
  mutate(across(c(PTS_Degrees, Flexion_Degrees, ATT_ACL, Load_N), as.numeric)) %>%
  summarize(
    across(all_of(c("PTS_Degrees", "Flexion_Degrees", "ATT_ACL", "Load_N")), 
           list(
             最小值 = ~min(., na.rm = TRUE),
             第一四分位数 = ~quantile(., 0.25, na.rm = TRUE),
             中位数 = ~median(., na.rm = TRUE),
             均值 = ~mean(., na.rm = TRUE),
             第三四分位数 = ~quantile(., 0.75, na.rm = TRUE),
             最大值 = ~max(., na.rm = TRUE)
           ))
  ) %>%
  pivot_longer(everything(), 
               names_sep = "_", 
               names_to = c("变量", "统计量"),
               values_to = "数值") %>%
  pivot_wider(names_from = "变量", values_from = "数值") %>%
  kbl() %>%
  kable_styling()

方案3:用skimr包快速生成专业统计表格

skimr包专门用于生成简洁美观的统计摘要,自带多种常用指标:

library(skimr)
library(kableextra)

ATT %>%
  mutate(across(c(PTS_Degrees, Flexion_Degrees, ATT_ACL, Load_N), as.numeric)) %>%
  skim() %>%
  skim_to_wide() %>%
  select(variable, n_missing, complete_rate, mean, sd, p0, p25, p50, p75, p100) %>%
  kbl(col.names = c("变量", "缺失值数量", "完整率", "均值", "标准差", "最小值", "第一四分位数", "中位数", "第三四分位数", "最大值")) %>%
  kable_styling()

内容的提问来源于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.25 08:57:53