如何按Name列去重并保留qsec列值更高的行?
问题描述
现有如下R数据框,其中Name列存在重复值,需要移除Name列的重复项,保留每个Name对应qsec列数值更高的行;同时需处理多行重复、qsec值相同的场景(这种场景下可选择保留所有重复行,或仅保留一行,以下方案覆盖两种需求)。
data <- structure(list(mpg = c(21, 21, 22.8, 21.4, 21, 21, 22.8, 21.4), cyl = c(6, 6, 4, 6, 6, 6, 4, 6), disp = c(160, 160, 108, 258, 160, 160, 108, 258), hp = c(110, 110, 93, 110, 110, 110, 93, 110), drat = c(3.9, 3.9, 3.85, 3.08, 3.9, 3.9, 3.85, 3.08), wt = c(2.62, 2.875, 2.32, 3.215, 2.62, 2.875, 2.32, 3.215), qsec = c(17.66, 17.02, 19.61, 19.84, 16.46, 17.82, 18.61, 19.44), vs = c(0, 0, 1, 1, 0, 0, 1, 1), am = c(1, 1, 1, 0, 1, 1, 1, 0), gear = c(4, 4, 4, 3, 4, 4, 4, 3), carb = c(4, 4, 1, 1, 4, 4, 1, 1), Name = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive")), row.names = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Mazda RX41", "Mazda RX4 Wag1", "Datsun 7101", "Hornet 4 Drive1"), class = "data.frame")
解决方案
方法一:Base R实现
保留所有qsec最大值的行
先按Name分组并对qsec降序排序,再提取每组中qsec等于最大值的所有行:
# 按Name分组,qsec降序排列 sorted_data <- data[order(data$Name, -data$qsec), ] # 提取每组qsec最大值的所有行 result_base_all <- do.call(rbind, lapply(split(sorted_data, sorted_data$Name), function(x) x[x$qsec == max(x$qsec), ]))
仅保留每组qsec最大值中的一行
通过which.max取每组qsec最大的第一行(若有多个相同最大值,随机保留一行):
result_base_single <- do.call(rbind, lapply(split(data, data$Name), function(x) x[which.max(x$qsec), ]))
方法二:dplyr(tidyverse)实现
dplyr语法更简洁,适合快速数据处理:
保留所有qsec最大值的行
library(dplyr) result_dplyr_all <- data %>% group_by(Name) %>% filter(qsec == max(qsec)) %>% ungroup()
仅保留每组qsec最大值中的一行
使用slice_max,通过with_ties参数控制是否保留重复最大值行:
result_dplyr_single <- data %>% group_by(Name) %>% slice_max(qsec, n = 1, with_ties = FALSE) %>% ungroup()
- 说明:
with_ties = FALSE时,若存在多个相同最大值仅保留第一行;设为TRUE则保留所有最大值行,效果与上述filter方法一致。
内容的提问来源于stack exchange,提问作者Shaxi Liver
相关产品推荐
相关产品推荐

