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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:55:57