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

在gtsummary中实现二分类变量分组及表格N列格式调整问题

解决方案

问题分析

你之前的modify_table_body未生效,是因为bstfun::add_variable_grouping生成的"GP"行,其variable列并非"GP",因此ifelse(variable == "GP", ...)无法匹配到目标行。同时我们可以用gtsummary原生方法替代第三方分组函数,实现更可控的分组效果。

修正后代码

set.seed(123)
library(tidyverse)
library(gtsummary)

d <- tidyr::tibble(
  id = c(1:20),
  et_yn = structure(factor(sample(seq(0,1), size = 20, replace = TRUE), levels = c(0,1), labels = c("No", "Yes")), label = "ET")
) %>%
  rowwise() %>%
  mutate(
    et_typ_1 = factor(ifelse(et_yn == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0,1), labels = c("No", "Yes")),
    et_typ_2 = factor(ifelse(et_yn == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0:1), labels = c("No", "Yes")),
    et_gp_1 = factor(ifelse(et_typ_2 == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0,1), labels = c("No", "Yes")),
    et_gp_2 = factor(ifelse(et_typ_2 == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0,1), labels = c("No", "Yes")),
    et_gp_3 = factor(ifelse(et_typ_2 == "Yes", sample(seq(0,1), size = 1, replace = T), NA), levels = c(0,1), labels = c("No", "Yes")),
  ) %>%
  mutate(
    et_typ_2 = structure(et_typ_2, label = "ET gp"),
    et_gp_1 = structure(et_gp_1, label = "St.a"),
    et_gp_2 = structure(et_gp_2, label = "St.b"),
    et_gp_3 = structure(et_gp_3, label = "St.c"),
  )

d %>%
  tbl_summary(
    include = -id,
    missing = "no",
  ) %>%
  add_n() %>%
  modify_header(stat_0 = "**n (%)**") %>%
  # 手动实现分组并调整列值
  modify_table_body(
    fun = ~ .x %>%
      # 标记GP组的变量
      mutate(is_gp_var = variable %in% c("et_gp_1", "et_gp_2", "et_gp_3")) %>%
      # 在第一个GP变量前插入分组行
      add_row(
        variable = "gp_group",
        label = "GP",
        row_type = "label",
        n = first(.[is_gp_var, "n"]), # 提取子项的N值
        stat_0 = "",
        is_gp_var = FALSE,
        .before = which(is_gp_var)[1]
      ) %>%
      # 调整子项的N列为空,添加缩进
      mutate(
        n = ifelse(is_gp_var, NA, n),
        label = ifelse(is_gp_var, paste0("  ", label), label)
      ) %>%
      select(-is_gp_var)
  ) %>%
  gtsummary::as_kable()

关键步骤说明

  1. 标记分组变量:用is_gp_var标记属于GP组的三个变量,方便后续批量处理。
  2. 插入分组行:在第一个GP组变量行前插入"GP"行,设置其N值为子项的共同N值(4),统计列留空。
  3. 调整子项显示:将GP组子项的N列设为NA(显示为空),并给标签添加缩进,实现分组视觉效果。
  4. 替代第三方分组函数:全程使用gtsummary原生的modify_table_body和add_row实现分组,无需依赖bstfun包。

输出效果

CharacteristicNn (%)
ET209 (45%)
et_typ_193 (33%)
ET gp94 (44%)
GP4
St.a2 (50%)
St.b1 (25%)
St.c1 (25%)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:18:09