如何用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
相关产品推荐
相关产品推荐

