如何在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()
关键逻辑说明
- 单元格级隐藏:通过自定义函数
handle_small_n提取分类变量单元格中的样本量n,当n<5时清空单元格内容 - 整列级隐藏:通过
modify_cols_hide检查每列的总样本量N,若N<5则直接隐藏该列 - 连续变量不受规则影响,正常展示均值与标准差
内容的提问来源于stack exchange,提问作者Stats Iliterate
相关产品推荐
相关产品推荐

