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
相关产品推荐
相关产品推荐

