如何基于合并纵向研究数据集构建并列对比分析表格
生成两项纵向研究特征并列表格
需求说明
我有一个合并数据集,包含两项纵向研究(study1与study2)的测量记录,示例数据如下:
data <- data.frame( weight_study1 = rnorm(100, mean = 60, sd = 5), # 数值型变量 weight_study2 = rnorm(100, mean = 62, sd = 6), # 数值型变量 gender_study1 = sample(c("Male", "Female"), 100, replace = TRUE), # 分类变量 gender_study2 = sample(c("Male", "Female"), 100, replace = TRUE) # 分类变量 )
需要创建一个并列表格,将study1与study2的分析结果分别置于表格两侧,期望输出样式如下:
Characteristics Pilot study 1 Pilot study 2 Age 34(3) 67(8) Gender Male (40%) Male(30%) Female (60%) Female (70%)
解决方案
下面提供两种在R中实现的方法,按需选择:
方式一:用tableone包快速生成(推荐)
tableone是专门生成基线特征对比表的工具,步骤如下:
- 安装并加载依赖包
install.packages(c("tableone", "dplyr")) library(tableone) library(dplyr)
- 把宽格式数据转成适合分组的长格式
# 拆分并标记两组数据 data_study1 <- data %>% select(weight = weight_study1, gender = gender_study1) %>% mutate(study = "Pilot study 1") data_study2 <- data %>% select(weight = weight_study2, gender = gender_study2) %>% mutate(study = "Pilot study 2") # 合并成长格式 data_long <- bind_rows(data_study1, data_study2)
- 生成并输出Markdown格式表格
# 指定变量类型 vars <- c("weight", "gender") catVars <- c("gender") # 创建特征表 table <- CreateTableOne(vars = vars, factorVars = catVars, data = data_long, strata = "study") # 输出为Markdown格式 print(table, printToggle = FALSE, format = "markdown")
输出示例:
| Characteristics | Pilot study 1 (N=100) | Pilot study 2 (N=100) |
|---|---|---|
| weight (mean (sd)) | 59.8 (4.9) | 62.1 (5.8) |
| gender = Male (%) | 48 (48.0) | 52 (52.0) |
| gender = Female (%) | 52 (52.0) | 48 (48.0) |
方式二:手动计算后构建表格
如果不想用第三方包,可手动统计后生成表格:
# 计算study1的统计值 weight1_stats <- sprintf("%.1f(%.1f)", mean(data$weight_study1), sd(data$weight_study1)) gender1_male <- sprintf("Male (%.0f%%)", mean(data$gender_study1 == "Male")*100) gender1_female <- sprintf("Female (%.0f%%)", mean(data$gender_study1 == "Female")*100) # 计算study2的统计值 weight2_stats <- sprintf("%.1f(%.1f)", mean(data$weight_study2), sd(data$weight_study2)) gender2_male <- sprintf("Male (%.0f%%)", mean(data$gender_study2 == "Male")*100) gender2_female <- sprintf("Female (%.0f%%)", mean(data$gender_study2 == "Female")*100) # 构建表格数据框 table_df <- data.frame( Characteristics = c("Weight", "Gender", ""), `Pilot study 1` = c(weight1_stats, gender1_male, gender1_female), `Pilot study 2` = c(weight2_stats, gender2_male, gender2_female) ) # 输出Markdown表格 knitr::kable(table_df, align = "lll")
输出示例:
| Characteristics | Pilot study 1 | Pilot study 2 |
|---|---|---|
| Weight | 59.8(4.9) | 62.1(5.8) |
| Gender | Male (48%) | Male (52%) |
| Female (52%) | Female (48%) |
内容的提问来源于stack exchange,提问作者user19807620
相关产品推荐
相关产品推荐

