使用 dplyr 的每组前“n”行——每组具有不同的数量

max*_*max 4 r dplyr data-cleaning data-wrangling

我将使用内置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 
Run Code Online (Sandbox Code Playgroud)

我想要的是每种饲料类型按重量计算的前几行。但是,对于每种 Feed 类型我都需要不同的编号吗?例如,

top_n_feed <-
  c(
    "casein" = 3,
    "horsebean" = 5,
    "linseed" = 3,
    "meatmeal" = 6,
    "soybean" = 3,
    "sunflower" = 2
  )
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点dplyr

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

chickwts %>%
  group_by(feed) %>% 
  slice_max(order_by = weight, n = 5)
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 6

这真的不是一个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)

Run Code Online (Sandbox Code Playgroud)

  • 伟大的思想和所有这些...... (2认同)