如何用gtsummary的tbl_svysummary生成带权重的分组均值表
用gtsummary的tbl_svysummary生成带权重的分组加权均值表
完整实现代码
包含示例数据构建、调查对象创建和正确的表格生成逻辑:
library(gtsummary) library(survey) library(tidyverse) # 构造示例调查数据 set.seed(123) df <- tibble( age_cat = sample(c("18-30", "31-50", "51+"), 1000, replace = TRUE), score = rnorm(1000, mean = 70, sd = 10), weight = runif(1000, min = 0.5, max = 2) # 调查权重列 ) # 创建survey包的调查对象(必须步骤,让gtsummary识别权重) svy_df <- svydesign(id = ~1, weights = ~weight, data = df) # 生成带权重的分组均值表 tbl_svysummary( data = svy_df, by = age_cat, # 指定分组变量(按该变量的类别拆分列) include = score, # 指定需要计算加权统计量的目标变量 statistic = list(all_continuous() ~ "{mean} ({sd})"), # 定义统计量展示格式 digits = list(all_continuous() ~ 1) # 控制小数位数 ) %>% modify_header(label = "调查分数") %>% # 自定义表头文本 bold_labels() # 加粗变量标签美化表格
参数逻辑与避坑说明
你之前出现表格方向错误,核心原因是颠倒了by和include的参数作用:
by:用来指定分组依据变量(比如age_cat),表格会将该变量的不同类别作为列展示include:用来指定需要计算统计量的目标变量(比如score),该变量会作为行展示
如果反过来设置,会变成按score分组展示age_cat的分布,完全偏离需求。
另外,gtsummary会自动识别svydesign对象,调用survey包的加权统计方法计算均值和标准差,无需手动用svymean提前计算。
对比无权重版本(你已实现的效果)
如果需要和你之前用tbl_continuous实现的无权重表做对照,代码如下:
tbl_continuous( data = df, variable = score, by = age_cat, statistic = ~"{mean} ({sd})" )
内容的提问来源于stack exchange,提问作者N.F.
相关产品推荐
相关产品推荐

