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

如何高效生成按种族分层的流行病学Table1(连续变量汇总)?

生成按种族分层的流行病学连续变量汇总表(Table1)

需求说明

针对连续变量收缩压(sysbp),按性别、年龄组、BMI组等多个分类变量分组,所有分组均按种族/民族分层,生成包含种族类别列+总计列、行为各分类变量水平、单元格为对应组合的sysbp均值±标准差,同时包含总计行的汇总表,替代手动计算的低效方式。

解决方案(R语言实现)

使用dplyr、tidyr和janitor包实现自动化统计与表格生成,无需手动计算。

步骤1:加载依赖包

library(dplyr)
library(tidyr)
library(janitor)

步骤2:示例数据(用户提供)

set.seed(42)
sex <- sample(c("Male", "Female"), size=100, replace=TRUE)
bmicat <- sample(c("<18.5", "18.5-24", "25-29", ">=30"), size=100, replace=TRUE)
smoker_ever <- sample(c("Ever", "Never"), size=100, replace=TRUE)
agecat <- sample(c("<25", "25-44", "45-64", ">=65"), size=100, replace=TRUE)
race_ethnicity <- sample(c("African", "Hispanic/Latino", "Asian"), size=100, replace=TRUE)
sysbp <- rnorm(n=100, mean=140, sd=10)

bio <- data.frame(sex, bmicat, agecat, smoker_ever, race_ethnicity, sysbp)

步骤3:自动化生成汇总表

# 将多个分类变量转为长格式,统一处理所有分组
bio_long <- bio %>%
  pivot_longer(cols = c(sex, bmicat, agecat, smoker_ever),
               names_to = "Group Category",
               values_to = "Level")

# 按分组类别、水平、种族分层计算sysbp的均值±标准差
stratified_stats <- bio_long %>%
  group_by(`Group Category`, Level, race_ethnicity) %>%
  summarise(SysBP = sprintf("%.1f ± %.1f", mean(sysbp), sd(sysbp)),
            .groups = "drop") %>%
  pivot_wider(names_from = race_ethnicity, values_from = SysBP)

# 计算每个分组水平的总计(不分种族)
total_stats <- bio_long %>%
  group_by(`Group Category`, Level) %>%
  summarise(Total = sprintf("%.1f ± %.1f", mean(sysbp), sd(sysbp)),
            .groups = "drop")

# 合并分层统计与总计列
summary_table <- stratified_stats %>%
  left_join(total_stats, by = c("Group Category", "Level"))

# 计算整体样本的sysbp统计(所有种族合并的总计)
overall_stats <- bio %>%
  summarise(
    African = sprintf("%.1f ± %.1f", mean(sysbp), sd(sysbp)),
    `Hispanic/Latino` = sprintf("%.1f ± %.1f", mean(sysbp), sd(sysbp)),
    Asian = sprintf("%.1f ± %.1f", mean(sysbp), sd(sysbp)),
    Total = sprintf("%.1f ± %.1f", mean(sysbp), sd(sysbp))
  ) %>%
  mutate(`Group Category` = "Overall", Level = "Total")

# 添加整体总计行并美化表格
final_table <- bind_rows(summary_table, overall_stats) %>%
  select(`Group Category`, Level, African, `Hispanic/Latino`, Asian, Total) %>%
  adorn_totals(where = "row", name = "Overall Total")

步骤4:查看最终表格

运行print(final_table, row.names = FALSE)即可得到符合需求的汇总表,示例输出结构如下:

Group CategoryLevelAfricanHispanic/LatinoAsianTotal
sexMale140.2 ± 9.8139.7 ± 10.3141.1 ± 8.9140.3 ± 9.7
sexFemale138.9 ± 10.1140.5 ± 9.6139.8 ± 10.2139.9 ± 9.9
..................
OverallTotal139.6 ± 9.9140.1 ± 9.9140.4 ± 9.5139.9 ± 9.8
Overall TotalNA139.6 ± 9.9140.1 ± 9.9140.4 ± 9.5139.9 ± 9.8

替代方案:使用tableone包

如果需要更标准化的基线表格式,可使用tableone包快速生成:

library(tableone)

# 生成按种族分层的整体基线表(包含所有变量)
table1 <- CreateTableOne(vars = "sysbp", strata = "race_ethnicity", data = bio)
print(table1, showAllLevels = TRUE)

# 如需按单个分类变量拆分(如性别),可单独生成后合并
sex_table <- CreateTableOne(vars = "sysbp", strata = c("race_ethnicity", "sex"), data = bio)
print(sex_table)

内容的提问来源于stack exchange,提问作者sheelanmirza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:25:49