在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)
补充说明
- 处理多个最大值的情况:如果同一个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()
- 保留所有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
相关产品推荐
相关产品推荐

