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

如何在R中对DataFrame各列单独执行0-1最小-最大归一化

按列实现DataFrame的0-1归一化(Min-Max缩放)

你需要对DataFrame的每列单独基于自身的最小值和最大值做0-1归一化,但现有两段代码要么逻辑错误,要么未按列处理,下面是问题分析和修正方案:

原代码问题分析

Code 1 问题

这段代码用lapply遍历了每一列,但归一化逻辑不符合0-1缩放的标准:

Data_profile_standardized <- data.frame(lapply(Data_profile, function(x) scale(x, center = FALSE, scale = max(x, na.rm = TRUE)/1)))

它仅执行了x / max(x)的操作,没有减去列的最小值,不是标准的0-1归一化公式(正确公式为(x - min(x))/(max(x)-min(x)))。如果列中存在负值,结果会出现小于0的情况,完全不符合需求。

Code 2 问题

normalize <- Vectorize(function(v) (v-min(v))/diff(range(v)))
dfout <- data.frame(normalize(Data_profile_standardize ))

Vectorize在这里属于多余操作,且直接将整个DataFrame传入normalize时,函数会把所有列的值当成一个整体向量处理,计算的是整个DataFrame的全局min和max,而非每列单独的极值,因此实现的是全局归一化,而非按列处理。

正确实现方案

方案1:基础R(lapply按列处理)

定义标准的min-max归一化函数,用lapply遍历每一列单独计算:

# 定义按列归一化的函数,自动忽略NA值
min_max_norm <- function(col) {
  col_min <- min(col, na.rm = TRUE)
  col_max <- max(col, na.rm = TRUE)
  (col - col_min) / (col_max - col_min)
}

# 应用到DataFrame的每一列,返回结构一致的新DataFrame
Data_profile_normalized <- data.frame(lapply(Data_profile, min_max_norm))

lapply会逐个将DataFrame的列传入函数,每列单独计算自身的极值,完美实现按列归一化。

方案2:dplyr(tidy风格简洁实现)

如果你习惯使用tidyverse工具,用dplyr::across可以快速处理所有列:

library(dplyr)

Data_profile_normalized <- Data_profile %>%
  mutate(across(everything(), ~ {
    col_min <- min(.x, na.rm = TRUE)
    col_max <- max(.x, na.rm = TRUE)
    (.x - col_min) / (col_max - col_min)
  }))

across(everything())会遍历所有列,对每列执行大括号内的归一化逻辑,结果保留原DataFrame的列名和结构。

方案3:修正你的Code 2

只需去掉Vectorize,改用lapply按列传参即可:

normalize <- function(v) (v - min(v, na.rm = TRUE)) / diff(range(v, na.rm = TRUE))
dfout <- data.frame(lapply(Data_profile, normalize))

diff(range(v, na.rm=TRUE))等价于max(v)-min(v),lapply确保每列单独计算极值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:45:41