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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:37:04