如何使用pivot_wider创建双层表头提升回归模型结果表可读性
实现双层表头回归结果表方案
步骤1:调整宽表转换逻辑
你当前的pivot_wider写法会生成estimate_A、estimate_B这类列,所有估计值列在前、t值列在后,无法满足同模型两个指标相邻的需求。需要先把指标列拉长再转宽,让同模型的两列紧挨:
library(dplyr) library(tidyr) # 示例数据生成(和你提供的逻辑一致) regression <- c(rep("A", 3), rep("B", 3), rep("C", 3), rep("D", 3), rep("E", 3), rep("F", 3)) attribute <- rep(c("b0", "b1", "b2"), 6) estimate <- round(runif(n = 18, min = 0, max = 10), 2) tstat <- round(runif(n = 18, min = 0, max = 10), 2) tbl <- tibble(regression, attribute, estimate, tstat) # 调整后的宽表转换 tbl_wide <- tbl %>% # 先把estimate、tstat转成统一的值列 pivot_longer(cols = c(estimate, tstat), names_to = "indicator") %>% # 按「模型-指标」的顺序生成列,同模型的两个列自动相邻 pivot_wider(names_from = c(regression, indicator), names_sep = "_", values_from = value)
步骤2:生成带双层表头的可交互/可导出表格
可以根据你的使用场景选择gt(适合HTML/PDF输出)或者flextable(适合Word/PPT输出)实现双层表头:
方案1:使用gt包实现
library(gt) gt(tbl_wide, rowname_col = "attribute") %>% # 设置第一层表头(模型名) tab_spanner(label = "模型A", columns = starts_with("A_")) %>% tab_spanner(label = "模型B", columns = starts_with("B_")) %>% tab_spanner(label = "模型C", columns = starts_with("C_")) %>% tab_spanner(label = "模型D", columns = starts_with("D_")) %>% tab_spanner(label = "模型E", columns = starts_with("E_")) %>% tab_spanner(label = "模型F", columns = starts_with("F_")) %>% # 简化第二层表头显示名,去掉模型前缀 cols_label_with(fn = ~ sub("^[A-F]_", "", .x))
方案2:使用flextable包实现
library(flextable) ft <- flextable(tbl_wide) # 新增第一层表头行 ft <- add_header_row(ft, values = c("", rep(c("模型A","模型B","模型C","模型D","模型E","模型F"), each = 2)), top = TRUE) # 合并同模型的第一层表头单元格 for(i in 1:6) { ft <- merge_at(ft, i = 1, j = (i*2):(i*2+1), part = "header") } # 修改第二层表头名称 ft <- set_header_labels(ft, A_estimate = "estimate", A_tstat = "tstat", B_estimate = "estimate", B_tstat = "tstat", C_estimate = "estimate", C_tstat = "tstat", D_estimate = "estimate", D_tstat = "tstat", E_estimate = "estimate", E_tstat = "tstat", F_estimate = "estimate", F_tstat = "tstat") ft
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

