You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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将得到符合要求的分类结果:

grpvalclass
g10A
g11A
g27A
g211B

内容的提问来源于stack exchange,提问作者andrsn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:13:29