我知道如何从 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)
一种方法是使用不等式连接,其中负数
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
这是一种使用
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()
),并且会得到相同的结果。