R语言:如何对数据框多变量做均值标准化并添加_sd后缀?
解决均值标准化并添加
_sd后缀的问题 没问题!我帮你调整代码来实现批量均值标准化(均值=0、标准差=1),同时给标准化后的变量加上_sd后缀,用dplyr就能轻松搞定,比手动逐个添加高效多了。
推荐写法(dplyr 1.0.0+版本)
现在dplyr推荐用across()代替旧的mutate_at(),写法更简洁直观,直接一步完成标准化和命名:
data("mtcars") # 定义需要标准化的变量列表 sd_outcomes <- c("disp", "hp", "wt", "qsec") # 执行标准化并添加_sd后缀 data <- mtcars %>% mutate( across( all_of(sd_outcomes), ~scale(., center = TRUE, scale = TRUE), .names = "{col}_sd" ) )
代码解释:
all_of(sd_outcomes):精准指定我们要处理的变量列表~scale(., center = TRUE, scale = TRUE):这就是核心的均值标准化逻辑,center=TRUE让均值为0,scale=TRUE让标准差为1.names = "{col}_sd":自动给新生成的列命名为「原列名+_sd」,比如disp变成disp_sd,省去了额外的重命名步骤
旧版dplyr写法(<1.0.0)
如果你还在使用旧版本的dplyr,可以用mutate_at()来实现:
data("mtcars") sd_outcomes <- c("disp", "hp", "wt", "qsec") data <- mtcars %>% mutate_at(vars(one_of(sd_outcomes)), funs(sd = scale(., center = TRUE, scale = TRUE))) %>% rename_at(vars(contains("_sd")), funs(paste0(gsub("_sd$", "", .), "_sd")))
或者更简化的写法,直接在funs()里指定新列名:
data <- mtcars %>% mutate_at(vars(one_of(sd_outcomes)), funs(paste0(., "_sd") = scale(., center = TRUE, scale = TRUE)))
验证结果
你可以用下面的代码检查标准化是否成功:
# 查看标准化后变量的均值(应该接近0) colMeans(data[, paste0(sd_outcomes, "_sd")]) # 查看标准化后变量的标准差(应该接近1) apply(data[, paste0(sd_outcomes, "_sd")], 2, sd)
内容的提问来源于stack exchange,提问作者aelhak




