在新列中根据多个参数分配类别

编程语言 2026-07-08

使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章