如何在gtsummary的tbl_summary中仅展示分类数据的Top10高频条目?
问题
我想在gtsummary的tbl_summary()中仅展示分类数据的Top10高频条目。目前我用forcats、dplyr等包写了代码,能在控制台生成包含Top10生物名称、频率及占比的表格,但希望把它转成gtsummary格式的表格(和报告其他部分样式统一),却不知道怎么限制只显示10种最常见的生物。
示例数据集生成代码:
library(AMR) df <- data.table::as.data.table(example_isolates) df$name <- mo_name(df$mo)
当前实现代码:
library(forcats) library(dplyr) library(magrittr) table <- fct_count(df$name, sort = T, prop = T)%>% slice_head(n = 10) table$p <- round(table$p, digits = 3) table$p <- table$p * 100 table %<>% rename(Organism = f,`%` = p) table
解决方案
有两种方式可以实现需求,适配不同的展示场景:
方式1:保留Top10+合并低频为「其他」(推荐)
先把分类变量处理成仅保留前10个高频类别,剩余低频类别统一归为「其他」,再用tbl_summary()生成格式统一的表格,既完整展示数据分布,又符合报告样式要求。
library(gtsummary) library(forcats) library(dplyr) # 预处理:保留Top10高频类别,其余归为"其他"并按频率排序 df_processed <- df %>% mutate(name = fct_lump_n(name, n = 10, other_level = "其他")) %>% mutate(name = fct_infreq(name)) # 生成gtsummary表格 tbl_summary(df_processed, include = name, statistic = list(name = "{n} ({p}%)"), label = list(name = "微生物名称")) %>% modify_header(label = "**类别**") %>% bold_labels()
方式2:仅展示纯Top10条目
如果不需要保留低频数据,可先筛选出Top10类别对应的行,再生成表格:
library(gtsummary) library(dplyr) # 提取Top10类别名称 top10_names <- df %>% count(name, sort = TRUE) %>% slice_head(n = 10) %>% pull(name) # 过滤数据集并按频率排序 df_top10 <- df %>% filter(name %in% top10_names) %>% mutate(name = fct_infreq(name)) # 生成gtsummary表格 tbl_summary(df_top10, include = name, statistic = list(name = "{n} ({p}%)"), label = list(name = "微生物名称")) %>% modify_header(label = "**类别**") %>% bold_labels()
代码说明
fct_lump_n():快速合并低频类别,n=10指定保留的高频类别数量,other_level自定义合并后的类别名称fct_infreq():让类别按出现频率从高到低排序,保证Top10的展示顺序符合预期tbl_summary()的statistic参数自定义展示的统计量(频率+占比),modify_header()和bold_labels()用于优化表格样式,和报告其他部分统一
内容的提问来源于stack exchange,提问作者missanita
相关产品推荐
相关产品推荐

