如何用dplyr/purrr批量计算R数据框_var列相对其余_var列均值的偏差
错误原因
你报错的核心是across()内部的代词.默认指代当前遍历到的单列向量,而非整个数据集,对向量调用select()自然会触发类型不匹配的错误。
实现方案
方案1:纯dplyr实现(推荐)
借助cur_column()获取当前处理的列名,用.data指代当前完整数据集即可实现批量计算:
library(dplyr) df <- df %>% mutate(across( .cols = contains("_var"), .fns = ~ .x - rowMeans(select(.data, contains("_var") & !cur_column())), .names = "{.col}_md" ))
参数说明:
.names = "{.col}_md"自动给新生成的列添加_md后缀,避免覆盖原列cur_column()返回当前across正在遍历的列名.data是dplyr提供的代词,指代当前管道传输的完整数据集
方案2:dplyr+purrr实现
如果更习惯purrr的批量映射逻辑,可以先提取所有目标列名再批量计算:
library(dplyr) library(purrr) # 提取所有带`_var`后缀的列名 var_cols <- grep("_var", names(df), value = TRUE) # 批量计算所有差值列 md_cols <- map_dfc(var_cols, function(col) { df[[col]] - rowMeans(select(df, all_of(var_cols) & !all_of(col))) }) %>% set_names(paste0(var_cols, "_md")) # 绑定到原数据集 df <- bind_cols(df, md_cols)
两种方案运行后得到的结果和你逐列计算的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Polina B
相关产品推荐
相关产品推荐

