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

R语言中如何按分组选取不同数量的Top N数据?以penguins为例

按分组选取不同数量Top N数据的R语言实现

在处理分组数据时,如果需要为不同分组选取不同数量的Top N数据(比如按体重筛选不同企鹅物种的Top个体),直接用top_n()传入固定数值的方式无法满足需求,以下是针对penguins数据集的具体实现方案:

首先定义各分组的选取规则(注意先将字符型的数量转为数值型):

library(tidyverse)
library(palmerpenguins)

top_x <- tribble(
  ~ species,  ~x,
  "Adelie",   "10",
  "Chinstrap",    "20",
  "Gentoo",   "15"
) %>% mutate(x = as.integer(x))

方法一:合并数据后按分组切片

通过left_join将规则与原数据合并,再按分组排序后选取对应数量的Top数据:

penguins %>%
  left_join(top_x, by = "species") %>%
  group_by(species) %>%
  arrange(desc(body_mass_g), .by_group = TRUE) %>%
  slice_head(n = first(x)) %>%  # 取分组内对应的Top数量
  ungroup() %>%
  select(-x)  # 可选:移除用于辅助的x列

方法二:使用group_modify处理分组

利用group_modify对每个分组单独处理,匹配对应的Top数量后筛选:

penguins %>%
  group_by(species) %>%
  group_modify(function(data, group_key) {
    # 获取当前分组对应的Top数量
    target_n <- top_x$x[top_x$species == group_key$species]
    data %>% top_n(target_n, wt = body_mass_g)
  }) %>%
  ungroup()

补充说明

top_n()函数的n参数默认是全局常量,无法直接传入随分组变化的变量,因此需要借助分组内的逻辑(如slice_head结合first(x),或group_modify的自定义函数)来实现不同分组取不同数量的Top数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:07:10