从r中的组中选择变量top n

问题描述 投票:0回答:2

我知道如何从 r 中的组中选择固定的前 n 个,但是如果我想从不同组中选择不同数量的前值呢?以企鹅数据为例,如果我想从每组中选择以下数字怎么办?

top_x <- tribble(
~ species,  ~x,
"Adelie",   "10",
"Chinstrap",    "20",
"Gentoo",   "15"
)

那么我如何将其传递给 top_n 或者有其他方法可以实现这一点?基本上,如何用与不同组名称匹配的不同 x 值替换下面的 10。

penguins %>% group_by(species) %>% top_n(10, wt = body_mass_g)
r group-by tidyverse
2个回答
0
投票

一种方法是使用不等式连接,其中负数

body_mass_g
使用
row_number()
(或
min_rank()
,具体取决于您是否想要包含关系)按组进行排名:

library(palmerpenguins)
library(dplyr)

penguins |>
  mutate(x = row_number(-body_mass_g), .by = species) |>
  right_join(top_x |>
               mutate(x = as.integer(x)), join_by(species, x$x <= y$x))


# A tibble: 45 × 10
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex    year   x.x   x.y
   <chr>   <fct>              <dbl>         <dbl>             <int>       <int> <fct> <int> <int> <int>
 1 Adelie  Torgersen           39.2          19.6               195        4675 male   2007     4    10
 2 Adelie  Torgersen           42.5          20.7               197        4500 male   2007     8    10
 3 Adelie  Dream               39.8          19.1               184        4650 male   2007     5    10
 4 Adelie  Dream               39.6          18.8               190        4600 male   2007     6    10
 5 Adelie  Torgersen           41.8          19.4               198        4450 male   2008    10    10
 6 Adelie  Torgersen           42.9          17.6               196        4700 male   2008     3    10
 7 Adelie  Biscoe              41            20                 203        4725 male   2009     2    10
 8 Adelie  Biscoe              43.2          19                 197        4775 male   2009     1    10
 9 Adelie  Biscoe              45.6          20.3               191        4600 male   2009     7    10
10 Adelie  Dream               37.5          18.5               199        4475 male   2009     9    10
# ℹ 35 more rows
# ℹ Use `print(n = ...)` to see more rows

0
投票

这是一种使用

pmap()
的方法:

purrr::pmap_dfr(top_x, \(species, x) penguins[penguins$species == species,][seq_len(x),])

输出:

# A tibble: 45 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 35 more rows
# ℹ 2 more variables: sex <fct>, year <int>

您可以改为使用

filter()
top_n()
(或
slice_max()
,或
slice_head()
),并且会得到相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.