首页 > 解决方案 > 使用 dplyr 的每组的前“n”行——每组的数量不同

问题描述

我将使用内置chickwts数据作为示例。

这是数据,有 5 种提要类型。

> head(chickwts)

  weight      feed
1    179 horsebean
2    160 horsebean
3    136 horsebean
4    227 horsebean
5    217 horsebean
6    168 horsebean

> table(chickwts$feed)

   casein horsebean   linseed  meatmeal   soybean sunflower 
       12        10        12        11        14        12 

我想要的是每种饲料类型的重量排在前几行。但是,我需要为每种 Feed 类型设置不同的编号吗?例如,

top_n_feed <-
  c(
    "casein" = 3,
    "horsebean" = 5,
    "linseed" = 3,
    "meatmeal" = 6,
    "soybean" = 3,
    "sunflower" = 2
  )

我怎样才能做到这一点dplyr

要按n重量获取每种提要类型的前几行,我可以使用如下代码,但我不确定如何将其扩展到每种提要类型的不同数字。

chickwts %>%
  group_by(feed) %>% 
  slice_max(order_by = weight, n = 5)

标签: rdplyrdata-cleaningdata-wrangling

解决方案


这真的不是一件dplyr容易命名的事情。我建议合并数据然后过滤。


tibble(feed=names(top_n_feed), topn=top_n_feed) %>% 
  inner_join(chickwts) %>% 
  group_by(feed) %>% 
  arrange(desc(weight), .by_group=TRUE) %>% 
  filter(row_number() <= topn) %>%
  select(-topn)


推荐阅读