如何在flextable或gtsummary中实现表头跨列合并
实现表头跨列合并的表格样式
问题背景
使用dplyr和flextable处理mtcars数据集的代码如下,当前生成的是普通结构表格,希望修改为表头跨列合并的样式:
library(dplyr) library(flextable) mtcars %>% select(mpg, cyl, am) %>% group_by(cyl, am) %>% summarise(mean_mpg = mean(mpg), sd_mpg = sd(mpg)) %>% flextable()
方法一:使用flextable实现
通过add_header_row()添加顶层表头并设置跨列合并,配合表头调整实现需求:
library(dplyr) library(flextable) mtcars %>% select(mpg, cyl, am) %>% group_by(cyl, am) %>% summarise(mean_mpg = mean(mpg), sd_mpg = sd(mpg), .groups = "drop") %>% flextable() %>% # 添加跨列顶层表头,colwidths定义每个表头覆盖的列数 add_header_row( values = c("分组信息", "MPG统计"), colwidths = c(2, 2) ) %>% # 替换底层表头文本(可选,增强可读性) set_header_labels( cyl = "气缸数", am = "传动类型", mean_mpg = "均值", sd_mpg = "标准差" ) %>% # 合并顶层表头的跨列单元格 merge_h(part = "header") %>% # 可选:添加表格边框美化样式 theme_booktabs()
关键说明
colwidths参数对应顶层表头的列覆盖数,这里分组列共2个、统计列共2个,因此设置为c(2,2)merge_h(part = "header")完成顶层表头的跨列合并,实现视觉上的分组效果
方法二:使用gtsummary实现
利用gtsummary的分组统计功能,结合表头修改实现跨列合并:
library(dplyr) library(gtsummary) mtcars %>% select(mpg, cyl, am) %>% # 将分组列转为因子,优化表头显示文本 mutate( cyl = factor(cyl, labels = c("4缸", "6缸", "8缸")), am = factor(am, labels = c("自动", "手动")) ) %>% # 按双分组变量统计mpg的均值和标准差 tbl_summary( by = c(cyl, am), statistic = list(all_continuous() ~ "{mean} ({sd})"), include = mpg ) %>% # 设置顶层表头文本 modify_header( label = "**指标**", all_stat_cols() ~ "**分组信息**" ) %>% # 合并指标列单元格,配合顶层表头实现跨列效果 merge_rows(columns = label) %>% # 可选:转为flextable格式以便进一步样式调整 as_flex_table()
关键说明
by = c(cyl, am)指定双分组变量,statistic定义连续变量的统计输出格式all_stat_cols()匹配所有统计列,统一设置顶层表头文本为"分组信息"
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

