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

在R中按指定列去重并选取另一列值最小对应行的实现方法

问题解答

1. distinct()的默认选取规则

dplyr的distinct()函数在遇到同个指定列对应多行时,默认保留该列唯一值第一次出现的对应行,没有内置自定义选取规则的参数,要实现按其他列取值筛选去重行的需求,需要搭配其他dplyr函数使用。

2. 实现按col1去重且取col2最小值行的方法

方法1:group_by() + slice_min()(推荐,dplyr 1.0.0及以上版本支持)

这是最直观的实现方式,按分组取指定列最小值的行:

library(dplyr)

# 构造示例数据
df <- data.frame(
  col1 = c("a", "b", "a", "b", "a", "c", "a"),
  col2 = c(10, 12, 8, 14, 15, 6, 3)
)

# 执行去重筛选
result <- df %>%
  group_by(col1) %>%
  slice_min(col2, n = 1) %>%
  ungroup()

如果同个col1下存在多个col2相同最小值的行,默认会全部返回,仅需保留1行的话可以加参数with_ties = FALSE。

方法2:arrange() + distinct() 兼容旧版本

利用distinct()默认保留首次出现行的规则,先按col1、col2升序排序,再对col1去重,参数.keep_all = TRUE用于保留所有列数据:

result <- df %>%
  arrange(col1, col2) %>%
  distinct(col1, .keep_all = TRUE)

两种方法输出结果均符合预期:

col1 col2
1    a    3
2    b   12
3    c    6

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:54:08