基于多参数在palmerpenguins数据集新增分类列
基于参数表为企鹅添加多分类标签解决方案
需求说明
使用palmerpenguins数据集和独立参数表df_query,为每只企鹅新增CATEGORY列,标记为small/medium/large,要求:
- 同时依据**喙长(bill_length_mm)和体重(body_mass_g)**两项参数判断
- 逻辑完全依赖
df_query参数表,可复现 - 若企鹅符合多个分类的参数范围,标记所有匹配分类(逗号分隔);无匹配则标记为NA
现有尝试仅使用喙长单参数判断,未满足需求。
环境与参数表
library(tidyverse) library(palmerpenguins) # 分类参数表:定义各分类的喙长、体重区间 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))
解决方案代码
方法一:交叉连接+分组聚合(适合大规模数据)
penguins_withCATEGORY <- penguins %>% # 添加唯一行标识,确保分组精准 mutate(row_id = row_number()) %>% # 让每只企鹅与所有分类参数配对 cross_join(df_query) %>% # 筛选符合当前分类参数的记录(排除NA值避免误判) filter( !is.na(bill_length_mm), !is.na(body_mass_g), bill_length_mm > BILL_MIN, bill_length_mm <= BILL_MAX, body_mass_g > MASS_MIN, body_mass_g <= MASS_MAX ) %>% # 按企鹅分组,聚合所有匹配的分类 group_by(row_id, across(-CATEGORY, -BILL_MIN:-MASS_MAX)) %>% summarise(CATEGORY = str_c(CATEGORY, collapse = ", "), .groups = "drop") %>% # 补回所有原始企鹅数据,无匹配的标记为NA right_join(penguins %>% mutate(row_id = row_number()), by = c("row_id", names(penguins))) %>% # 移除临时行标识 select(-row_id)
方法二:逐行判断(代码更简洁)
penguins_withCATEGORY <- penguins %>% rowwise() %>% mutate( # 筛选当前企鹅符合的所有分类 matched_cats = list(df_query$CATEGORY[ !is.na(bill_length_mm) & !is.na(body_mass_g) & bill_length_mm > df_query$BILL_MIN & bill_length_mm <= df_query$BILL_MAX & body_mass_g > df_query$MASS_MIN & body_mass_g <= df_query$MASS_MAX ]), # 处理无匹配的情况,将多分类用逗号连接 CATEGORY = case_when( length(matched_cats) == 0 ~ NA_character_, TRUE ~ str_c(matched_cats, collapse = ", ") ) ) %>% ungroup() %>% select(-matched_cats) # 移除临时变量
代码说明
- 两种方法均严格依据
df_query的参数区间判断,修改参数表即可更新分类逻辑 - 自动处理NA值:喙长或体重为NA的企鹅,直接标记为NA
- 支持多分类匹配:若企鹅同时符合多个分类的参数范围,会将所有匹配分类用逗号连接显示
内容的提问来源于stack exchange,提问作者shu251
相关产品推荐
相关产品推荐

