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

如何使用dplyr按行取最大值并归一化数据框指定列?

用dplyr对数据框多行按行最大值归一化(iris数据集示例)

当然可以实现这个需求!你之前用max()函数没成功,是因为dplyr默认是按列计算最大值,而非按行。下面我给你两种高效的解决方案,都支持指定列范围,不用逐个列名:

方法1:用rowwise() + c_across()(dplyr 1.0.0+推荐写法)

这种写法直观易懂,适合小到中等规模的数据集:

library(dplyr)

# 对Sepal.Length到Petal.Width的列按行归一化
iris_normalized <- iris %>%
  rowwise() %>%  # 开启按行处理模式
  mutate(
    # 指定要处理的列范围,用当前行的最大值做除法
    across(Sepal.Length:Petal.Width, ~ .x / max(c_across(Sepal.Length:Petal.Width)))
  ) %>%
  ungroup()  # 取消按行分组,避免影响后续操作

关键说明:

  • rowwise():让后续的mutate操作逐行执行
  • c_across(Sepal.Length:Petal.Width):提取当前行指定范围的列作为数值向量,这样max()就能计算该行的最大值
  • 你可以灵活替换列范围,比如用1:4(按列位置)、starts_with(c("Sepal", "Petal"))(按列名前缀)等

方法2:用do.call(pmax, ...)(无分组,效率更高)

如果你的数据集很大,推荐这个方法——不用开启按行分组,运算速度更快:

iris_normalized <- iris %>%
  # 先计算每行的最大值,存为临时列row_max
  mutate(row_max = do.call(pmax, select(., Sepal.Length:Petal.Width))) %>%
  # 对目标列做归一化
  mutate(across(Sepal.Length:Petal.Width, ~ .x / row_max)) %>%
  select(-row_max)  # 可选:删除临时的row_max列

验证结果

以你提到的第一行数据为例:

原数据:5.1 3.5 1.4 0.2 setosa
归一化后:1.000 0.686 0.275 0.039 setosa

完全符合你的需求,Species列会完整保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:40:21