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

如何对数据集除首列外的列做均值±25%范围的归一化(R语言)

解决方法:按列均值±25%范围归一化

没问题,我来帮你实现这个需求!你想要把除A列外的每一列都归一化到各自均值的±25%区间里,用scales包的rescale函数完全可以做到,关键是要给每一列匹配对应的均值区间,批量应用到目标列上。

步骤1:构造数据集与准备均值

首先先把你的数据转换成R可处理的data.frame,同时整理好已知的列均值:

# 构造你的数据集
df <- data.frame(
  A = c(500, 501, 502),
  B = c(2, 6, 4),
  C = c(4, 8, 7),
  D = c(6, 45, 9)
)

# 已知各列均值(如果是从数据计算的,后面会补充方法)
col_means <- list(B = 4, C = 6.333, D = 20)

步骤2:自定义归一化函数

我们写一个专门的函数,接收列向量和该列的均值,用rescale把数据缩放到均值*0.75到均值*1.25的区间:

library(scales)
library(dplyr)

# 自定义归一化函数:将x缩放到[mean*0.75, mean*1.25]
rescale_to_mean_range <- function(x, col_mean) {
  rescale(x, to = c(col_mean * 0.75, col_mean * 1.25))
}

步骤3:批量应用到目标列

用dplyr的across函数(替代旧的mutate_at),批量处理B、C、D列,每列自动匹配对应的均值:

normalized_df <- df %>%
  mutate(
    across(
      all_of(names(col_means)),  # 指定要处理的列:B、C、D
      ~ rescale_to_mean_range(.x, col_means[[cur_column()]])  # 对每列应用函数,传入对应均值
    )
  )

验证结果

运行完后,你可以查看归一化后的数据集:

print(normalized_df)
#      A   B        C        D
# 1 500 3.0 4.749750 15.00000
# 2 501 5.0 7.916250 25.00000
# 3 502 4.0 6.916125 15.76923
  • B列均值4,归一化后范围是3~5,原数据2→3、6→5、4→4,完全符合要求
  • C列均值6.333,范围是4.74975~7.91625,原数据4→4.74975、8→7.91625、7→6.916125,完美落在区间内
  • D列均值20,范围是15~25,原数据6→15、45→25、9→15.769,所有值都被限制在均值±25%的区间里

补充:如果均值不是预先已知

如果你的列均值不是提前给出的,而是需要从数据中计算,可以先运行这行代码获取均值:

# 从数据中计算除A列外的各列均值
col_means_calculated <- df %>% select(-A) %>% summarise_all(mean) %>% as.list()

然后把上面代码里的col_means换成col_means_calculated即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:16:05