R语言基于各列最大值计算多列值占比的代码问题排查
现有代码的问题
你当前的循环逻辑是按行取最大值,max(df[i, 1:4]) 取的是第i行所有列的最大值,计算规则为「每行内各值除以该行最大值」,和你需要的「按列取最大值、计算列内各值占该列最大值的百分比」需求完全相反,这就是结果不符合预期的核心原因。
正确实现方案
方案1:修改原有循环逻辑
调整循环遍历顺序,先遍历列取每列最大值,再遍历行计算该列内所有值的占比:
output <- df # 外层遍历列,先取当前列的最大值 for (j in 1:ncol(df)) { col_max <- max(df[, j]) # 内层遍历行,计算当前列每个值的占比,保留两位小数 for (i in 1:nrow(df)) { output[i, j] <- round(df[i, j] * 100 / col_max, 2) } } output
方案2:更高效的向量化写法(R更推荐,无需手写循环)
基础R实现:
# 按列计算百分比,保留两位小数 output <- round(apply(df, 2, function(x) x / max(x) * 100), 2) # apply默认返回矩阵,可转成数据框格式 output <- as.data.frame(output)
dplyr实现:
library(dplyr) output <- df %>% mutate(across(everything(), ~round(.x / max(.x) * 100, 2)))
以上两种方案输出结果均和你给出的期望结果一致。
内容的提问来源于stack exchange,提问作者U108456
相关产品推荐
相关产品推荐

