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

