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

如何按分组选取数据集第N大的行?含iris实操疑问

问题解答

关于修改[2L]为[3L]的疑问

是的,把代码里的[2L]改成[3L],确实能获取每组Species下去重后的Sepal.Length第三大值。但要注意:如果某组的Sepal.Length唯一值数量少于3个,这个操作会返回NA——比如假设某组只有2个不同的花萼长度值,那取第三大就没有对应结果了。

如何选取原数据集中对应的完整行

如果要拿到每组中对应第N大Sepal.Length的完整行,有几种更直接的dplyr方法,可根据你对重复值的处理需求选择:

方法1:先去重再取第N大行(和原代码逻辑一致)

先对每组的Sepal.Length去重并保留完整行,再按降序排序后取第N行:

library(dplyr)

# 定义N为你要取的第N大,示例为3
N <- 3

iris %>%
  group_by(Species) %>%
  distinct(Sepal.Length, .keep_all = TRUE) %>% # 按花萼长度去重,保留整行数据
  arrange(desc(Sepal.Length)) %>% # 按花萼长度降序排列
  slice(N) # 取第N行

方法2:保留所有等于第N大值的行(含重复值)

如果原数据中有多个行的Sepal.Length等于第N大值,想要全部保留,可以用dense_rank标记排名:

N <- 3

iris %>%
  group_by(Species) %>%
  mutate(rank_num = dense_rank(desc(Sepal.Length))) %>% # 相同值共享同一排名,跳过重复位次
  filter(rank_num == N)

如果用rank()代替dense_rank(),相同值会占用多个排名位(比如两个最大值会占第1、2名),此时第三大值的排名会变成3,结果逻辑会和原代码去重后的逻辑有差异,可根据需求选择。

方法3:用slice_max简化操作

slice_max可直接按分组取最大的n个值对应的行,结合n=N拿到前N大的行后,取最后一行就是第N大的:

N <- 3

iris %>%
  group_by(Species) %>%
  distinct(Sepal.Length, .keep_all = TRUE) %>%
  slice_max(Sepal.Length, n = N) %>%
  slice(N)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:20:30