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

在R中使用mutate()和across()实现列值除以列均值的问题

问题解答:将以"A"开头的列除以对应列的均值

需求说明

给定数据框:

df = data.frame(A1 = c(1,2,3),
                A2 = c(4,5,6))

需要将所有以"A"开头的列的数值,除以该列的整体均值,生成新的标准化列。

原代码的错误点

  1. 语法逻辑错误:第二个mutate中,across(matches("A"), .names = "adm_A_{col}")缺少核心操作函数,across语法要求第二个参数是要应用到列上的处理逻辑,仅指定列选择和新列名不符合dplyr规范。
  2. 运算逻辑错误:即使补上函数,直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:00:54