如何在R语言中按分组查找最大值对应的列名
R语言分组查找最大值对应列名
数据定义
创建目标数据框的代码如下:
df <- data.frame(Product= paste0("AE", c(1:11)), Condition=c("-","A","A","B","B","B","C","C","C","D","D"), Score1=c(0.231,0.831,0.894,1e-05,1e-05,1e-05,0.874,0.785,0.879,1e-08,1e-08), Score2=c(0.968,0.168,0.105,0.239,0.149,0.125,1e-05,1e-05,1e-05,0.159,0.105), Score3=c(1e-07,1e-07,1e-07,1e-07,1e-07,1e-07,1e-05,1e-05,1e-05,0.855,0.827), Score4=c(1e-07,1e-07,1e-07,1e-07,1e-07,1e-07,0.492,0.500,0.656,1e-08,1e-08))
分组结果
使用split(df, df$Condition)按Condition字段分组后,得到的分组列表如下:
> split(df, df$Condition) $`-` Product Condition Score1 Score2 Score3 Score4 1 AE1 - 0.231 0.968 1e-07 1e-07 $A Product Condition Score1 Score2 Score3 Score4 2 AE2 A 0.831 0.168 1e-07 1e-07 3 AE3 A 0.894 0.105 1e-07 1e-07 $B Product Condition Score1 Score2 Score3 Score4 4 AE4 B 1e-05 0.239 1e-07 1e-07 5 AE5 B 1e-05 0.149 1e-07 1e-07 6 AE6 B 1e-05 0.125 1e-07 1e-07 $C Product Condition Score1 Score2 Score3 Score4 7 AE7 C 0.874 1e-05 1e-05 0.492 8 AE8 C 0.785 1e-05 1e-05 0.500 9 AE9 C 0.879 1e-05 1e-05 0.656 $D Product Condition Score1 Score2 Score3 Score4 10 AE10 D 1e-08 0.159 0.855 1e-08 11 AE11 D 1e-08 0.105 0.827 1e-08
需求
找出每个分组中数值最大的列名,最终生成如下格式的结果表格:
Condition Column - Score1 A Score1 B Score2 C Score1 D Score3
解决方案
提供两种实用实现方式:
方式一:使用dplyr包分组处理
library(dplyr) result <- df %>% group_by(Condition) %>% summarise(Column = names(.)[which.max(colSums(select(., starts_with("Score"))))], .groups = "drop") print(result, row.names = FALSE)
说明:
- 按
Condition分组后,筛选出所有以Score开头的数值列 - 通过
colSums计算每列总和(同一分组内最大值所在列的总和必然最大,也可替换为colMeans或全局最大值判断) - 用
which.max定位总和最大的列索引,再通过names(.)获取对应列名
方式二:基础R原生实现(无第三方依赖)
# 按Condition分组 grouped <- split(df, df$Condition) # 遍历分组,提取最大值对应列名 result_list <- lapply(grouped, function(g) { score_cols <- g[, startsWith(names(g), "Score")] max_col <- names(score_cols)[which.max(colSums(score_cols))] data.frame(Condition = unique(g$Condition), Column = max_col) }) # 合并结果并清理行名 result <- do.call(rbind, result_list) rownames(result) <- NULL print(result)
说明:
- 用
split完成分组后,遍历每个分组筛选出Score列 - 同样通过
colSums+which.max定位最大值所在列 - 合并所有分组结果并移除行名,得到目标格式
运行任意一种方案的代码,均可得到符合需求的结果表格。
内容的提问来源于stack exchange,提问作者Roq
相关产品推荐
相关产品推荐

