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

