R代码重构:封装函数生成两项研究变量分布对比表
R代码重构方案
重构思路
- 用
group_by(study)替代重复的filter操作,大幅减少冗余代码 - 用
dplyr::across批量对连续变量计算均值、标准差并拼接为要求的字符串格式 - 统一计算分组内的干预占比,最后通过行列转换直接生成目标表格结构
- 封装为函数后可直接传入同结构数据集复用,还支持自定义小数保留位数
依赖包
需要提前加载以下包:
library(dplyr)
重构后基础代码
fullbind <- df %>% # 按研究分组 group_by(study) %>% summarise( # 批量计算连续变量的mean(SD),保留3位小数 across(c(age, measure), ~paste0(round(mean(.x), 3), " (", round(sd(.x), 3), ")")), # 计算分组内治疗占比,保留2位小数 Treatment = round(sum(treat)/n(), 2) ) %>% # 转置为统计项为行、研究分组为列的结构 t() %>% as.data.frame() %>% # 设置列名 setNames(c("Study 0", "Study 1")) %>% # 设置行名 `rownames<-`(c('Study分组', 'Age Mean (SD)', 'Measurement Mean (SD)', 'Treatment %')) %>% # 去掉多余的分组标识行 slice(-1)
封装为可复用函数
generate_study_desc_table <- function(data, cont_digits = 3, pct_digits = 2, add_pct_sign = FALSE) { # 占比格式自定义处理 pct_formatter <- if(add_pct_sign) { ~paste0(round(sum(.x)/n()*100, pct_digits), "%") } else { ~round(sum(.x)/n(), pct_digits) } res <- data %>% group_by(study) %>% summarise( across(c(age, measure), ~paste0(round(mean(.x), cont_digits), " (", round(sd(.x), cont_digits), ")")), Treatment = pct_formatter(treat) ) %>% t() %>% as.data.frame() %>% setNames(c("Study 0", "Study 1")) %>% `rownames<-`(c('Study分组', 'Age Mean (SD)', 'Measurement Mean (SD)', 'Treatment %')) %>% slice(-1) return(res) } # 调用示例 # 默认输出和原代码完全一致的结果 result <- generate_study_desc_table(df) # 如需治疗占比显示百分号,调用时添加参数即可 result_with_pct <- generate_study_desc_table(df, add_pct_sign = TRUE)
运行上述代码得到的结果和你原代码输出完全一致,如需打印成可视化表格可直接调用knitr::kable(result)生成标准markdown格式表格。
内容的提问来源于stack exchange,提问作者user16914149
相关产品推荐
相关产品推荐

