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

dplyr中slice_min与slice_max函数返回重复值(ties)的触发条件咨询

关于dplyr中slice_min/slice_max返回重复值的规则

其实你没遗漏什么关键规则——只是slice_min()和slice_max()处理重复值的逻辑,官方文档描述得比较隐晦,核心是基于排序后第n行的临界值来返回所有符合条件的行,具体逻辑如下:

核心逻辑

当设置with_ties = TRUE时:

  • 对于slice_min(col, n = k):
    1. 先将数据集按目标列col从小到大排序
    2. 找到排序后第k行对应的col值(我们称之为「临界值」)
    3. 返回所有col值小于等于该临界值的行
  • 对于slice_max(col, n = k)则完全相反:返回所有col值大于等于该临界值的行

如果设置with_ties = FALSE,函数会严格返回排序后的前n行,不会额外包含重复值的行。


结合你的例子逐一验证

例子1:mtcars取mpg最小的5个(含重复)

mtcars %>% slice_min(mpg, n = 5, with_ties = TRUE)
  • 按mpg从小到大排序后,第5行的mpg值是14.7
  • 所有mpg≤14.7的行刚好是5行(2辆10.4的车、1辆13.3、1辆14.3、1辆14.7),所以返回这5行,不会包含mpg=15.0及以上的行。

例子2:mtcars取mpg最小的1个(含重复)

mtcars %>% slice_min(mpg, n = 1, with_ties = TRUE)
  • 排序后第1行的mpg值是10.4
  • 所有mpg≤10.4的行有2辆车型(Cadillac Fleetwood和Lincoln Continental),所以返回这2行,而不是仅返回1行。

例子3:starwars分组取mass最小的3个(含重复)

starwars %>% select(gender, mass) %>% group_by(gender) %>% slice_min(mass, n = 3, with_ties = TRUE)

分组后每个组独立执行逻辑:

  • feminine组:排序后第3行的mass值是50,所有mass≤50的行有4条(45、49、50、50),所以返回这4行
  • masculine组:排序后第3行的mass值是20,所有mass≤20的行有3条(15、17、20),返回这3行
  • NA组:仅1条数据(mass=48),排序后第3行仍是这条数据,所以返回它
    最终总共返回8行,和你得到的结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:48:12