在新列中根据多个参数分配类别
使用palmer penguins数据集以及下面的测试数据 df_query,我需要写一个函数或一组命令,为每只企鹅在新的一列中分配一个类别,类别名为small、medium或 large。
我希望这个过程具有可复现性,并且在同一行的企鹅同时符合多个参数条件时,能够输出 "NA",或输出不止一个类别。也存在一些重叠(我的数据也比这个更混乱)。
与之前的问题不同,因为这需要依赖一个单独的表格,并且涉及不止一个有界参数。
# Environment
library(tidyverse)
library(palmerpenguins)
head(penguins) # use this
df_query <- data.frame(CATEGORY = c("small", "medium", "large"),
BILL_MIN = c(30,35,44),
BILL_MAX = c(36,46,62),
MASS_MIN = c(2500,2800,3800),
MASS_MAX = c(2800,4000,6000))
## Add a new column to 'penguins', based on the bill length and body mass parameters from df_query
# penguins_withCATEGORY <- penguins %>%
# mutate()
有一个尝试看起来像这样,但它没有同时考虑两者。
penguins$CATEGORY <- sapply(
penguins$bill_len, function(x) penguins[
x > df_query$BILL_MIN &
x <= df_query$BILL_MAX, "CATEGORY"]
)
解决方案
首先,为了便于跟踪,我们添加一个行ID:
p2 <- penguins |> mutate(id = row_number(), .before = 1)
接着,我们可以对分类表进行非等值连接,为每个匹配创建多行,然后把每行的匹配类别(若有)合并成一个以逗号分隔的列表。我假设应包含MIN,但只包含到MAX的范围,你可以按需调整。
p2_cat <- p2 |>
left_join(df_query,
join_by(bill_length_mm >= BILL_MIN, bill_length_mm < BILL_MAX,
body_mass_g >= MASS_MIN, body_mass_g < MASS_MAX)) |>
reframe(CATEGORY = paste(CATEGORY, collapse = ", "), .by = id)
现在有了这些,我们就可以把类别添加回原始表,举例在第282行出现多重匹配:
p2 |>
left_join(p2_cat) |>
slice(1:9, 282)
#Joining with `by = join_by(id)`
## A tibble: 10 × 10
# id species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year CATEGORY
# <int> <fct> <fct> <dbl> <dbl> <int> <int> <fct> <int> <chr>
# 1 1 Adelie Torgersen 39.1 18.7 181 3750 male 2007 medium
# 2 2 Adelie Torgersen 39.5 17.4 186 3800 female 2007 medium
# 3 3 Adelie Torgersen 40.3 18 195 3250 female 2007 medium
# 4 4 Adelie Torgersen NA NA NA NA NA 2007 NA
# 5 5 Adelie Torgersen 36.7 19.3 193 3450 female 2007 medium
# 6 6 Adelie Torgersen 39.3 20.6 190 3650 male 2007 medium
# 7 7 Adelie Torgersen 38.9 17.8 181 3625 female 2007 medium
# 8 8 Adelie Torgersen 39.2 19.6 195 4675 male 2007 NA
# 9 9 Adelie Torgersen 34.1 18.1 193 3475 NA 2007 NA
#10 282 Chinstrap Dream 45.2 17.8 198 3950 female 2007 medium, large
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。