You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用gt包将汇总表的行分组转换为列展示?

解决方法

要实现把时间点从行转成列的双层表头结构,核心是先把数据从长格式转成宽格式,再用gt的表头分组功能完成布局。

步骤1:数据重塑(长转宽)

合并H_LG3和W_LG3后,用tidyr::pivot_wider将time维度转成列前缀,把estimate_ci和p_val两个指标展开到对应时间点下:

library(tidyr)
library(gt)

# 合并数据并重塑格式
combined_data <- rbind(H_LG3, W_LG3) %>%
  pivot_wider(
    id_cols = c(case_control, label),  # 保留行维度的关键列
    names_from = time,                # 将时间点转为列名前缀
    values_from = c(estimate_ci, p_val),  # 要展开的指标列
    names_sep = "_"  # 列名分隔符,生成如estimate_ci_时间点1的列名
  )

步骤2:用gt构建目标表格

基于重塑后的宽格式数据,用gt的tab_spanner创建时间点分组表头,同时保留原有的行分组、格式设置:

combined_data %>%
  gt() %>%
  # 设置指标列的数字格式
  fmt_number(
    columns = starts_with(c("estimate_ci", "p_val")),
    decimals = 3
  ) %>%
  # 添加原有的行分组标签
  tab_row_group(group = md('**H**'), rows = 1:nrow(H_LG3)) %>%
  tab_row_group(group = md('**W**'), rows = (nrow(H_LG3) + 1):nrow(combined_data)) %>%
  # 创建时间点分组的上层表头
  tab_spanner(
    label = md("**时间点1**"),
    columns = ends_with("_时间点1")  # 匹配对应时间点的所有列
  ) %>%
  tab_spanner(
    label = md("**时间点2**"),
    columns = ends_with("_时间点2")
  ) %>%
  # 设置底层列的显示标签
  cols_label(
    case_control = md("**标签**"),
    estimate_ci_时间点1 = md("**Estimate(CI)**"),
    p_val_时间点1 = md("**P Value**"),
    estimate_ci_时间点2 = md("**Estimate(CI)**"),
    p_val_时间点2 = md("**P Value**")
  ) %>%
  # 不需要label列时可以隐藏
  cols_hide(columns = label) %>%
  tab_header(md("**Table 4**"))

关键说明

  • pivot_wider是行转列的核心,需确保id_cols包含所有需要保留为行维度的变量(比如这里的case_control)。
  • tab_spanner用于将同一时间点下的指标列合并到统一表头下,实现双层表头效果,若你的时间点命名不同,只需修改ends_with里的匹配内容即可。

内容的提问来源于stack exchange,提问作者Kelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:55:17