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
相关产品推荐
相关产品推荐

