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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:45:03