如何使用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
相关产品推荐
相关产品推荐

