在R中使用mutate()和across()实现列值除以列均值的问题
问题解答:将以"A"开头的列除以对应列的均值
需求说明
给定数据框:
df = data.frame(A1 = c(1,2,3), A2 = c(4,5,6))
需要将所有以"A"开头的列的数值,除以该列的整体均值,生成新的标准化列。
原代码的错误点
- 语法逻辑错误:第二个
mutate中,across(matches("A"), .names = "adm_A_{col}")缺少核心操作函数,across语法要求第二个参数是要应用到列上的处理逻辑,仅指定列选择和新列名不符合dplyr规范。 - 运算逻辑错误:即使补上函数,直接用
across(...) / across(...)会将两个across返回的所有列按位置两两相除,无法实现“对应列除以对应均值”的需求(会出现A1除以mean_A2这类错误匹配)。
正确实现方法
方法1:一步生成标准化列(推荐,无需额外均值列)
直接在across中完成“值/列均值”的计算,代码简洁高效:
library(dplyr) df %>% mutate(across(starts_with("A"), ~ .x / mean(.x), .names = "adm_A_{col}"))
运行结果:
A1 A2 adm_A_A1 adm_A_A2 1 1 4 0.6666667 0.8888889 2 2 5 1.3333333 1.1111111 3 3 6 2.0000000 1.3333333
方法2:保留均值列后再计算标准化列
如果需要保留各列的均值列,可通过cur_column()获取当前处理的列名,拼接对应的均值列名后做除法:
df %>% # 先生成均值列 mutate(across(starts_with("A"), ~ mean(.x), .names = "mean_{col}")) %>% # 对应列除以自身的均值列 mutate(across(starts_with("A"), ~ .x / get(paste0("mean_", cur_column())), .names = "adm_A_{col}"))
运行结果:
A1 A2 mean_A1 mean_A2 adm_A_A1 adm_A_A2 1 1 4 2 5 0.6666667 0.8888889 2 2 5 2 5 1.3333333 1.1111111 3 3 6 2 5 2.0000000 1.3333333
内容的提问来源于stack exchange,提问作者Vinicius B. de S. Moreira
相关产品推荐
相关产品推荐

