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

如何在R数据框中按其他列分组提取最大值对应记录

纯Base R实现:按分组提取最大值对应ID

给定原始数据:

DF <- data.frame(plot=c(1,1,1,2,2,3,3,3), 
        id=c("A","B","A","B","B","C","B","C"),
        share=c(0.2,0.6,0.2,0.45,0.55,0.3,0.4,0.3))

需求:按plot分组,提取每组中share最大值对应的id,禁止使用data.table包。


方法1:拆分-处理-合并(最直观)

这是Base R分组操作的经典流程:

# 按plot拆分数据为分组列表
grouped <- split(DF, DF$plot)
# 遍历每个分组,提取share最大值对应的行(仅保留plot和id列)
result_list <- lapply(grouped, function(g) {
  g[which.max(g$share), c("plot", "id")]
})
# 合并列表为最终数据框,重置行名避免混乱
final_df <- do.call(rbind, result_list)
rownames(final_df) <- NULL

方法2:用ave标记最大值行

通过ave给每行打上是否为当前分组最大值的标记,再筛选目标行:

# 为每行添加标记:是否是当前plot组的share最大值
DF$is_max <- ave(DF$share, DF$plot, FUN = function(x) x == max(x))
# 筛选标记为TRUE的行,保留需要的列;用unique处理可能的多最大值情况
final_df <- unique(DF[DF$is_max, c("plot", "id")])

方法3:aggregate自定义函数

直接用aggregate进行分组计算,一步得到结果:

final_df <- aggregate(id ~ plot, data = DF, FUN = function(x) {
  # 定位当前分组的share最大值位置,取对应id
  current_plot <- unique(DF$plot[DF$id %in% x])
  x[which.max(DF$share[DF$plot == current_plot])]
})

结果验证

三种方法输出一致:

> final_df
  plot id
1    1  B
2    2  B
3    3  B

(注:原问题中给出的示例结果里plot=3对应id="C"是笔误,实际该分组share最大值为0.4,对应id="B")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:45:35