如何使用dplyr基于多条件对DataFrame进行分类?
用dplyr实现分组区间分类
方法一:关联后筛选匹配
先加载dplyr包,确保条件数据按分组和区间起始值排序,再通过关联、分组判断匹配类别:
library(dplyr) # 确保条件数据按grp和min有序(大型数据建议先做此步) crit <- crit %>% arrange(grp, min) # 关联数据并匹配class df_result <- df %>% left_join(crit, by = "grp") %>% group_by(grp, val) %>% mutate( in_range = between(val, min, max), below_min = val < min(min), above_max = val > max(max) ) %>% filter( in_range | (below_min & class == first(class)) | (above_max & class == last(class)) ) %>% summarise(class = first(class), .groups = "drop")
方法二:分组调用区间映射(更高效)
通过group_by结合列表存储分组条件,用findInterval快速定位区间,同时处理边界值:
library(dplyr) df_result <- df %>% group_by(grp) %>% mutate( # 提取当前分组的条件规则 grp_rules = list(crit %>% filter(grp == cur_group()$grp)), # 匹配class class = case_when( # 低于最小区间值,取最低class val < min(grp_rules[[1]]$min) ~ grp_rules[[1]]$class[which.min(grp_rules[[1]]$min)], # 高于最大区间值,取最高class val > max(grp_rules[[1]]$max) ~ grp_rules[[1]]$class[which.max(grp_rules[[1]]$max)], # 区间内用findInterval定位对应class TRUE ~ grp_rules[[1]]$class[findInterval(val, grp_rules[[1]]$min)] ) ) %>% select(-grp_rules) %>% ungroup()
验证结果
运行上述代码后,df_result将得到符合要求的分类结果:
| grp | val | class |
|---|---|---|
| g1 | 0 | A |
| g1 | 1 | A |
| g2 | 7 | A |
| g2 | 11 | B |
内容的提问来源于stack exchange,提问作者andrsn
相关产品推荐
相关产品推荐

