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

在R语言中筛选重复ID行,保留对应value列值最大的行

解决方案:保留重复ID中value最大的行

针对你的需求,用dplyr可以一步完成筛选重复ID并保留对应最大value行的操作,以下是具体实现:

基础实现代码

library(dplyr)

# 示例数据
mydf <- data.frame(ID = c(1,2,2,3,4), value = c(5, 8, 20, 18,15))

# 筛选重复ID的行,并保留每个ID的最大value行
result <- mydf %>%
  group_by(ID) %>%
  # 第一个条件筛选出有重复的ID组,第二个条件保留组内value最大的行
  filter(n() > 1, value == max(value)) %>%
  ungroup()

print(result)

运行后输出:

# A tibble: 1 × 2
     ID value
  <dbl> <dbl>
1     2    20

封装成可复用函数

如果需要像你之前的find_dup一样封装成函数,支持传入任意数据集、ID列和value列,可以用tidyeval语法实现:

keep_max_dup <- function(dataset, id_var, value_var) {
  dataset %>%
    group_by({{id_var}}) %>%
    filter(n() > 1, {{value_var}} == max({{value_var}})) %>%
    ungroup() %>%
    arrange({{id_var}})
}

# 调用函数
keep_max_dup(mydf, ID, value)

补充说明

  1. 处理多个最大值的情况:如果同一个ID存在多行value都是最大值(比如ID=2有两行value都是20),上面的filter会保留所有这些行。如果只想保留其中一行,可以用slice_max替代filter:
result <- mydf %>%
  group_by(ID) %>%
  filter(n() > 1) %>%
  slice_max(value, n = 1) %>% # n=1表示只留1行最大值
  ungroup()
  1. 保留所有ID的最大行(含不重复ID):如果你的需求是不管ID是否重复,都保留每个ID的最大value行,只需去掉n() > 1的条件:
full_result <- mydf %>%
  group_by(ID) %>%
  filter(value == max(value)) %>%
  ungroup()

运行后会保留ID=1、2、3、4各自的最大value行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:42:40