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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:14:54