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

如何用dplyr批量将多变量归一化至对照组均值?

用dplyr批量归一化变量至对照组均值

针对你需要将多个变量归一化到对照组对应均值的需求,完全可以用dplyr的批量处理工具替代繁琐的手动操作,尤其是变量数量多(比如20个)时,效率会高很多。

首先先重现你的数据:

df <- data.frame(Treatment=rep(c( "Control", "Drug 1", "Drug 2"), each=6 ), 
                 Score1=c(4,5,4,5,5,6,8,9,10,8,9,9,14,15,13,15,14,15), 
                 Score2=c(1,2,1,2,3,3,8,8,9,9,8,8,14,14,15,12,14,15))

方法一:先提取对照组均值,再批量归一化

这种方法先单独计算对照组各变量的均值,再对所有目标变量执行归一化操作,逻辑清晰,适合后续可能复用均值的场景:

library(dplyr)

# 第一步:计算Control组所有Score变量的均值
control_means <- df %>%
  filter(Treatment == "Control") %>%
  summarise(across(starts_with("Score"), mean))

# 第二步:对每个Score变量,除以对应的Control组均值,生成归一化列
df_normal <- df %>%
  mutate(
    across(
      starts_with("Score"),  # 选中所有以Score开头的变量
      ~ .x / control_means[[cur_column()]],  # 当前变量除以对照组对应均值
      .names = "{.col}_normalised"  # 新列命名规则:原列名+_normalised
    )
  )

方法二:单管道完成所有操作

如果不需要单独保存对照组均值,可以直接在一个管道里完成计算和归一化,更简洁:

df_normal <- df %>%
  # 先临时添加各变量的对照组均值列
  mutate(across(starts_with("Score"), 
                ~ mean(.x[Treatment == "Control"]),
                .names = "{.col}_control_mean")) %>%
  # 基于临时均值列计算归一化
  mutate(across(starts_with("Score"),
                ~ .x / get(paste0(cur_column(), "_control_mean")),
                .names = "{.col}_normalised")) %>%
  # 移除临时的均值列
  select(-ends_with("_control_mean"))

验证结果

比如Score1的对照组均值是(4+5+4+5+5+6)/6 ≈4.8333,第一个数据点的归一化值是4/4.8333≈0.8276,你可以用head(df_normal)查看,结果和手动计算完全一致。而且不管你有20个还是更多Score变量,只要命名符合ScoreX的规则,都会自动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:42:27