You need to enable JavaScript to run this app. 如何遍历含重复分组的DataFrame,提取每组最大值对应的行信息
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历含重复分组的DataFrame,提取每组最大值对应的行信息

原有循环代码的核心偏差
  • 遍历维度错配:1:length(df) 获取的是数据框的列总数,循环索引指向的是列而非行,完全没有覆盖到「按newid维度分组」的逻辑
  • 最大值计算失效:max(i, na.rm = F) 是对循环序号i本身求最大值,没有读取sbpval列的实际观测值,计算结果和业务需求毫无关联
  • 结果拼接逻辑错位:逐列通过cbind拼结果的思路,和“提取符合条件的完整观测行”的目标完全不匹配,最终输出杂乱是必然结果
可直接复现的正确实现

基础R原生方案(无需安装/加载额外包)

通过分组标记最大值位置,直接筛选对应行:

# 按newid分组,标记每组内sbpval等于组内最大值的行
df$is_max <- with(
  df,
  ave(sbpval, newid, FUN = function(x) x == max(x, na.rm = TRUE))
)
# 筛选标记为真的行,移除临时标记列得到最终结果
result <- subset(df, is_max == 1, select = -is_max)

这里必须给max()加na.rm = TRUE参数,否则碰到组内存在NA值的情况(比如示例里第一组的NA),会直接导致组内最大值计算失效,无法正确筛选。

dplyr简洁方案(可读性最高)

library(dplyr)
result <- df %>%
  group_by(newid) %>%
  # 每组取sbpval最大的1行,自动忽略NA、避免并列重复返回
  slice_max(sbpval, n = 1, with_ties = FALSE) %>%
  ungroup()
  • 内置自动处理NA、整行返回的逻辑,不需要手动写判断条件
  • 输出结构和原数据框完全一致,不会出现格式错乱的问题

data.table高效方案(适配大数据量场景)

library(data.table)
setDT(df)
# 按newid分组,定位组内sbpval最大的行并返回完整信息
result <- df[, .SD[which.max(sbpval)], by = newid]
  • which.max会自动跳过NA值定位最大值所在的行索引,计算速度远高于循环写法,适合几十万行以上的大样本数据

以上方案跑示例数据的输出,和你期望的效果完全一致:

newid sex visitnum sbpval
1 13580   M        3    124
2 21525   F        2    410

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 22:45:04