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

在R中实现双因子分组的结构化gt表格构建技术问询

实现双因子分组的gt表格解决方案

你之前的问题出在数据透视的方向上——我们需要把age作为列的主分组维度,同时让Variable作为行的分组,sex作为每个分组下的子行。下面用gt包一步步实现你想要的格式:

第一步:整理数据结构

首先我们需要把age数值映射为你期望的分组名称(age_y/age_m/age_o),然后将数据转换为适合gt分组的宽格式:

library(tidyverse)
library(gt)

# 你的示例数据
data <- data.frame(ID=c("Mary","Mary","Mary","Jane","Jane","Jane","John","John","John"),
                   sex=c("F","F","F","F","F","F","M","M","M"),
                   age=c(1,1,1,3,3,3,2,2,2),
                   Variable = c("VARIABLE 1", "VARIABLE 2", "VARIABLE 3"),
                   Count = c(45, 76, 43),
                   Percent = c(0.45, 0.56, 0.89))

# 处理数据:映射age分组名 + 转换宽格式
data_processed <- data %>%
  mutate(age_group = case_when(
    age == 1 ~ "age_y",
    age == 2 ~ "age_m",
    age == 3 ~ "age_o"
  )) %>%
  pivot_wider(
    id_cols = c(Variable, sex),
    names_from = age_group,
    values_from = c(Count, Percent),
    names_glue = "{age_group}_{.value}"
  ) %>%
  arrange(Variable)

第二步:用gt构建双分组表格

接下来我们用gt的分组功能,实现行按Variable分组、列按age分组的效果,同时优化表格样式:

final_table <- data_processed %>%
  # 将Variable设为行分组
  gt(groupname_col = "Variable") %>%
  # 按下划线自动拆分列分组(age_y/age_m/age_o)
  tab_spanner_delim(delim = "_") %>%
  # 把百分比列格式化为带%的形式
  fmt_percent(columns = contains("Percent"), decimals = 0) %>%
  # 重命名列,让表头更简洁
  cols_label(
    sex = "",
    age_y_Count = "Count",
    age_y_Percent = "Percent",
    age_m_Count = "Count",
    age_m_Percent = "Percent",
    age_o_Count = "Count",
    age_o_Percent = "Percent"
  ) %>%
  # 美化分组标题样式
  tab_style(
    style = cell_text(weight = "bold", size = 11),
    locations = cells_group()
  ) %>%
  # 加粗列分组标题
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_spanners()
  ) %>%
  # 添加行条纹,提升可读性
  opt_row_striping() %>%
  # 给行分组添加边框,区分不同Variable
  tab_options(
    row_group.border.top = border(width = 1),
    row_group.border.bottom = border(width = 1)
  )

final_table

效果说明

这个表格会完全符合你的期望:

  • 行:每个VARIABLE作为一个独立分组,下面包含Male和Female的两行数据
  • 列:每个age分组(age_y/age_m/age_o)作为列组,每组下包含Count和Percent两个子列
  • 百分比自动转换为XX%的格式,样式清晰易读

如果你想尝试kableExtra,也可以用group_rows()实现行分组,add_header_above()实现列分组,核心思路和上面的数据整理步骤一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:57:45