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

如何基于分组对多列执行Min-Max归一化(dplyr实现)

多列分组归一化的dplyr实现方案

推荐方案:使用across()批量处理列

dplyr的across()函数专门用来对多列执行相同操作,是处理这类需求最简洁的方式,支持指定具体列或按条件选择列,还能自定义新列命名规则。

1. 指定具体列生成归一化新列

如果你明确知道要处理的列(比如hp和mpg),可以直接列出来,同时生成带_norm后缀的新列(保留原始数据):

mtcars %>%
  group_by(carb) %>%
  mutate(
    across(
      c(hp, mpg), 
      ~(.x - min(.x)) / (max(.x) - min(.x)), 
      .names = "{col}_norm"
    )
  ) %>%
  ungroup()
  • c(hp, mpg):指定需要归一化的目标列
  • ~(.x - min(.x)) / (max(.x) - min(.x)):归一化逻辑,.x代表当前遍历的列
  • .names = "{col}_norm":设置新列名格式,{col}会自动替换为原列名,最终生成hp_norm、mpg_norm这类列

2. 对所有数值列执行归一化

如果需要批量处理所有数值类型的列,用where(is.numeric)作为列选择器即可:

mtcars %>%
  group_by(carb) %>%
  mutate(
    across(
      where(is.numeric), 
      ~(.x - min(.x)) / (max(.x) - min(.x)), 
      .names = "{col}_norm"
    )
  ) %>%
  ungroup()

3. 覆盖原列(不推荐)

如果不需要保留原始数据,直接覆盖原列的话,去掉.names参数即可:

mtcars %>%
  group_by(carb) %>%
  mutate(across(c(hp, mpg), ~(.x - min(.x)) / (max(.x) - min(.x)))) %>%
  ungroup()

备选方案:使用purrr实现

如果习惯用purrr的函数式风格,也可以结合map和mutate实现,但写法相对繁琐:

library(purrr)

# 定义需要归一化的列
cols_to_norm <- c("hp", "mpg")

mtcars %>%
  group_by(carb) %>%
  mutate(
    !!!set_names(
      map(cols_to_norm, ~(.data[[.x]] - min(.data[[.x]])) / (max(.data[[.x]]) - min(.data[[.x]]))),
      paste0(cols_to_norm, "_norm")
    )
  ) %>%
  ungroup()

内容的提问来源于stack exchange,提问作者user3670179

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:47:24