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

如何用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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:35:03