如何高效生成按种族分层的流行病学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 Category | Level | African | Hispanic/Latino | Asian | Total |
|---|---|---|---|---|---|
| sex | Male | 140.2 ± 9.8 | 139.7 ± 10.3 | 141.1 ± 8.9 | 140.3 ± 9.7 |
| sex | Female | 138.9 ± 10.1 | 140.5 ± 9.6 | 139.8 ± 10.2 | 139.9 ± 9.9 |
| ... | ... | ... | ... | ... | ... |
| Overall | Total | 139.6 ± 9.9 | 140.1 ± 9.9 | 140.4 ± 9.5 | 139.9 ± 9.8 |
| Overall Total | NA | 139.6 ± 9.9 | 140.1 ± 9.9 | 140.4 ± 9.5 | 139.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
相关产品推荐
相关产品推荐

