如何在gtsummary的分类水平/连续统计前显示缺失值行?
gtsummary自定义表格实现需求方案
实现步骤与代码
1. 核心配置思路
要实现「变量名与p值同行」「缺失值行前置(含0缺失场景)」「分类变量强制显示缺失值行」三个需求,需结合tbl_summary()参数配置、行顺序调整、p值样式设置来完成。
2. 完整可运行代码
library(gtsummary) library(dplyr) library(stringr) # 测试数据集 df <- data.frame(col1 = c(1:3, NA), col2 = c("this", NA,"is", "text"), col3 = c(TRUE, FALSE, TRUE, TRUE), col4 = c(2.5, 4.2, 3.2, NA), stringsAsFactors = FALSE) # 生成自定义表格 df %>% # 基础表格配置:强制显示缺失值行,定义统计量格式 tbl_summary( by = col3, missing = "always", # 强制分类变量显示缺失值行(即使无缺失) # 连续变量:先展示缺失值统计,再展示均值标准差 statistic = list( all_continuous() ~ "{N_miss} ({p_miss}%)\n{mean} ({sd})" ), # 自定义变量标签(可选) label = list( col1 ~ "连续变量1", col2 ~ "分类变量1", col4 ~ "连续变量2" ) ) %>% # 添加组间比较p值 add_p() %>% # 调整行顺序:将每个变量的缺失值行移至最前面 modify_table_body( ~ .x %>% group_by(variable) %>% arrange(desc(row_type == "level" & str_detect(label, "Missing")), .by_group = TRUE) %>% ungroup() ) %>% # 设置变量名与p值同行:仅在变量名行显示p值,清空其他行的p值 modify_table_styling( columns = p.value, rows = row_type == "label", label = "p值" ) %>% modify_table_body( ~ .x %>% mutate(p.value = ifelse(row_type == "label", p.value, NA)) ) %>% # 可选:加粗变量名行,增强视觉区分 modify_table_styling( rows = row_type == "label", bold = TRUE )
3. 关键配置说明
- 强制显示缺失值行:
missing = "always"参数确保分类变量无论是否存在缺失,都会生成缺失值统计行;连续变量通过statistic参数直接整合缺失值计数与占比。 - 缺失值行前置:通过
modify_table_body()按变量分组,将包含「Missing」的统计行排到该变量的最顶端。 - 变量名与p值同行:指定仅在变量名所在行(
row_type == "label")显示p值,其他行清空p值内容,实现同行展示效果。
4. 最终效果
生成的表格会满足:
- 每个变量名与对应p值在同一行(加粗突出)
- 每个变量的第一行统计内容为缺失值数量及占比(即使缺失数为0也会显示)
- 后续行依次展示该变量的常规统计结果(连续变量的均值±标准差、分类变量的各类别占比)
内容的提问来源于stack exchange,提问作者Mathica
相关产品推荐
相关产品推荐

