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

如何在R中实现gtable统计披露控制:隐藏n<5的单元格与列

统计披露控制的表格生成实现

需求说明

  • 数据集按A/B组分层,按性别生成描述性表格
  • 单元格规则:样本量n<5时,单元格内容置空
  • 列规则:整列样本量n<5时,隐藏该列
  • 核心目标:通过统计披露控制,避免小样本导致的参与者识别

解决方案代码

library(gtsummary)
library(dplyr)
library(stringr)

# 创建数据集
Group <- c("A", "B", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A",
           "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B",
           "A", "B", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A",
           "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B",
           "A", "B", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A",
           "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B")
Sex <- c("M", "F", "F", "M", "F", "M", "M", "M", "M", "F", "M", "M", "M",
         "M", "M", "F", "M", "M", "M", "M", "M", "F", "M", "F", "M", "F",
         "M", "F", "F", "M", "F", "M", "M", "M", "M", "F", "M", "M", "M",
         "M", "M", "F", "M", "M", "M", "M", "M", "F", "M", "F", "M", "F",
         "M", "F", "F", "M", "F", "M", "M", "M", "M", "F", "M", "M", "M",
         "M", "M", "F", "M", "M", "M", "M", "M", "F", "M", "F", "M", "F")
Height <- c(170, 181, 190, 183, 199, 165, 155, 170, 185, 176, 176, 177, 182, 
            181, 164, 165, 171, 181, 201, 171, 173, 167, 168, 184, 183, 182,
            170, 181, 190, 183, 199, 165, 155, 170, 185, 176, 176, 177, 182, 
            181, 164, 165, 171, 181, 201, 171, 173, 167, 168, 184, 183, 182,
            170, 181, 190, 183, 199, 165, 155, 170, 185, 176, 176, 177, 182, 
            181, 164, 165, 171, 181, 201, 171, 173, 167, 168, 184, 183, 182)
Ethnicity <- c("A", "A", "B", "A", "A", "C", "C", "B", "C", "C", "C", "D", "D",
              "E", "E", "D", "D", "D", "E", "E", "E", "A", "F", "C", "D", "F",
              "A", "A", "B", "A", "A", "C", "C", "B", "C", "C", "C", "D", "D",
              "E", "E", "D", "D", "D", "E", "E", "E", "A", "F", "C", "D", "F",
              "A", "A", "B", "A", "A", "C", "C", "B", "C", "C", "C", "D", "D",
              "E", "E", "D", "D", "D", "E", "E", "E", "A", "F", "C", "D", "F")

df <- data.frame(Group, Sex, Height, Ethnicity)

# 自定义函数:处理小样本单元格
handle_small_n <- function(x, threshold = 5) {
  # 提取单元格中的样本量n
  n_val <- str_extract(x, "(?<=\\{n\\} / )\\d+|^\\d+(?= / )") %>% as.numeric()
  # n<阈值时返回空值,否则返回原内容
  ifelse(is.na(n_val) | n_val < threshold, "", x)
}

df %>%
  tbl_strata(strata = Group,
             .tbl_fun = ~ .x %>%
               tbl_summary(by = Sex,
                           statistic = list(all_continuous() ~ "{mean} ({sd})",
                                            all_categorical() ~ "{n} / {N} ({p}%)"),
                           digits = all_continuous() ~ 1,
                           missing_text = "(Missing Data)") %>%
               # 对分类变量单元格应用小样本隐藏规则
               modify_fmt_fun(all_categorical() ~ handle_small_n) %>%
               # 隐藏整列样本量不足的列
               modify_cols_hide(
                 columns = where(function(col) {
                   # 提取列总样本量N
                   n_col <- str_extract(col[1], "(?<= / )\\d+(?= \\()") %>% as.numeric()
                   !is.na(n_col) && n_col < 5
                 })
               )
  ) %>%
  modify_header(label ~ "**Relevant Data**") %>%
  modify_caption("**Table 1. Key descriptives**") %>%
  bold_labels()

关键逻辑说明

  1. 单元格级隐藏:通过自定义函数handle_small_n提取分类变量单元格中的样本量n,当n<5时清空单元格内容
  2. 整列级隐藏:通过modify_cols_hide检查每列的总样本量N,若N<5则直接隐藏该列
  3. 连续变量不受规则影响,正常展示均值与标准差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:27:01