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

如何在tbl_summary()中设置变量层级分组并实现缩进显示?

在gtsummary里实现变量分组+层级缩进统计

一、gtsummary内置分组方案(优先用这个)

gtsummary本身就支持变量分组、整体统计展示和层级缩进,不用额外折腾数据预处理。拿预处理后的starwars数据集举例——假设我们把hair_color和skin_color归为「外观特征」组,height和mass归为「身体指标」组:

1. 先整理数据+定义分组映射

library(gtsummary)
library(dplyr)

# 筛选starwars里的有效数据
starwars_df <- starwars %>%
  select(name, hair_color, skin_color, height, mass, gender) %>%
  drop_na(hair_color, skin_color, height, mass)

# 给变量分配分组
var_groups <- list(
  "外观特征" = c("hair_color", "skin_color"),
  "身体指标" = c("height", "mass")
)

2. 生成带分组、整体统计和缩进的表格

用group=参数指定变量分组,add_overall()加整体统计列,最后用modify_table_styling()给单个变量行加缩进:

starwars_df %>%
  tbl_summary(
    by = gender,  # 按性别分组统计
    group = var_groups,  # 应用我们定义的变量分组
    statistic = list(
      all_categorical() ~ "{n} ({p}%)",
      all_continuous() ~ "{mean} ± {sd}"
    )
  ) %>%
  add_overall(label = "整体") %>%  # 添加上行的整体统计
  modify_table_styling(
    columns = label,
    rows = !is_group_row(),  # 只给非分组标题的行(单个变量)加缩进
    text_format = function(x) paste0("  ", x)  # 用两个空格实现层级缩进
  ) %>%
  modify_header(label = "**变量分组/变量**")

这里的group=是gtsummary原生的分组功能,会自动把同组变量归在一起,再通过缩进区分分组标题和单个变量,层级感直接就出来了。

二、数据预处理实现(自定义复杂场景用)

如果需要更灵活的自定义(比如要同时展示分组的汇总统计和组内单个变量的统计,像你说的apple、banana单独展示,还要显示fruits分组的整体统计),可以通过数据重塑来实现:

1. 先模拟数据+生成分组汇总变量

先造一个带逻辑变量的数据集,比如模拟apple、banana和它们的分组fruits:

# 给starwars数据加水果相关逻辑变量
fruit_df <- starwars_df %>%
  mutate(
    apple = sample(c(TRUE, FALSE), nrow(.), replace = TRUE),
    banana = sample(c(TRUE, FALSE), nrow(.), replace = TRUE),
    fruits = apple | banana  # fruits是apple和banana的整体分组
  ) %>%
  select(gender, apple, banana, fruits)

2. 重塑数据+标记层级

把数据转成长格式,给单个变量加缩进标记,同时调整显示顺序让分组行在前:

fruit_long <- fruit_df %>%
  pivot_longer(cols = -gender, names_to = "variable", values_to = "value") %>%
  mutate(
    # 标记分组和单个变量
    group_label = case_when(
      variable == "fruits" ~ "水果分组",
      TRUE ~ "单个水果"
    ),
    # 设定顺序:先显示分组,再显示单个变量
    order = case_when(
      variable == "fruits" ~ 1,
      variable == "apple" ~ 2,
      variable == "banana" ~ 3
    )
  ) %>%
  arrange(order)

3. 生成表格+设置缩进样式

用tbl_summary()生成表格,再给单个变量行加缩进:

fruit_long %>%
  tbl_summary(
    by = gender,
    include = c(group_label, variable, value),
    statistic = all_logical() ~ "{n} ({p}%)",
    label = list(variable ~ "变量", group_label ~ "分组")
  ) %>%
  modify_table_styling(
    columns = label,
    rows = variable %in% c("apple", "banana"),
    text_format = function(x) paste0("  ", x)
  ) %>%
  modify_header(label = "**分组/变量**")

这种方法适合需要自定义分组汇总的场景,完全按你的需求来调整层级和统计内容。

额外提示

  • 内置方案更省心,适合常规的变量分组展示;
  • 如果需要更精细的缩进控制,可以把表格转成gt对象,用gt::text_indent()函数调整;
  • 统计格式可以通过statistic=参数自定义,比如调整百分比小数位、均值格式等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:44:54