如何在gtsummary的tbl_summary中基于唯一用户计算小计与百分比?
问题描述
在R Markdown中使用gtsummary包分析长格式问卷数据时,遇到多选问题导致的统计偏差:同一user_id对应多行不同答案组合,默认tbl_summary按行数统计小计(N)和百分比,出现重复计数。例如Question1的A类小计应为3(3个唯一用户)而非6,C类小计应为1,且百分比需基于唯一用户数计算(允许列占比超100%)。需求是实现基于唯一user_id的小计统计,或手动覆盖小计,并添加适用的统计检验。
示例代码:
Test <- data.frame(user_id = c("1","1","2","3","3","4","4","4","5", "6"), Question1 = c("A","A","B","C","C","A","A","A","A","B"), Question2 = c("Side-effect 1", "Side-effect 2", "Side-effect 3", "Side-effect 1", "Side-effect 3", "Side-effect 1", "Side-effect 2", "Side-effect 3", "Side-effect 3", "Side-effect 1")) # 当前输出的代码 Test %>% gtsummary::tbl_summary(by = Question1, include = c(Question1, Question2))
当前输出:
Characteristic A, N = 6 B, N = 2 C, N = 2 Question2 Side-effect 1 2 (33%) 1 (50%) 1 (50%) Side-effect 2 2 (33%) 0 (0%) 0 (0%) Side-effect 3 2 (33%) 1 (50%) 1 (50%) 1 n (%)
期望输出:
Characteristic A, N = 3 B, N = 2 C, N = 2 Question2 Side-effect 1 2 (67%) 1 (50%) 1 (100%) Side-effect 2 2 (67%) 0 (0%) 0 (0%) Side-effect 3 2 (67%) 1 (50%) 1 (100%) 1 n (%)
解决方案
步骤1:计算分组唯一用户数
先统计每个Question1分组下的唯一user_id数量,用于替换表格顶部的N值:
# 生成分组唯一用户数的命名向量 group_n <- Test %>% dplyr::group_by(Question1) %>% dplyr::summarize(n = dplyr::n_distinct(user_id)) %>% tibble::deframe()
步骤2:自定义gtsummary表格统计逻辑
通过statistic参数指定用唯一用户数统计选项频次,并用modify_header替换分组的N值:
library(gtsummary) Test %>% tbl_summary( by = Question1, include = Question2, # 仅保留需要分析的Question2 # 自定义统计量:唯一用户数 (百分比) statistic = list(all_categorical() ~ "{dplyr::n_distinct(user_id)} ({style_percent(dplyr::n_distinct(user_id)/group_n[.by], digits = 1)}%)"), label = list(Question2 ~ "Question2") ) %>% # 替换分组标题中的N值为唯一用户数 modify_header( stat_1 ~ paste0("**A, N = ", group_n["A"], "**"), stat_2 ~ paste0("**B, N = ", group_n["B"], "**"), stat_3 ~ paste0("**C, N = ", group_n["C"], "**") ) %>% # 添加统计检验(此处用卡方检验,可根据数据调整) add_p(test = all_categorical() ~ "chisq.test")
关键说明
statistic参数中,dplyr::n_distinct(user_id)统计每个选项对应的唯一用户数,百分比计算基于分组的唯一用户数(group_n[.by]),允许列占比超过100%(符合多选问题的统计逻辑)。modify_header手动替换分组标题的N值,确保表头显示正确的唯一用户总数。add_p添加统计检验,针对分类数据可选择卡方检验、Fisher精确检验等,需根据数据分布调整。
内容的提问来源于stack exchange,提问作者Mason Barnes
相关产品推荐
相关产品推荐

