R语言:基于pos范围条件批量生成多列判断结果的方法
R语言批量生成分组范围判断列方案
示例数据构造
先创建符合需求的示例数据框:
# 主数据框:包含ID、分组标识及待判断的数值列 df <- data.frame( ID = 1:5, group = c("A", "B", "A", "C", "B"), value = c(12, 22, 16, 33, 18) ) # 分组范围配置表:每个分组对应的数值范围(拆分为最小值和最大值) dt <- data.frame( group = c("A", "B", "C"), pos_min = c(10, 20, 30), pos_max = c(15, 25, 35) ) # 若你的dt中pos是区间字符串(如"10-15"),可先拆分转换: # dt <- tidyr::separate(dt, pos, into = c("pos_min", "pos_max"), sep = "-", convert = TRUE)
当前逐列实现方式
如果手动为每个分组生成判断列,代码如下:
# 手动生成A组判断列:判断value是否在A组的pos范围内 df$A <- df$value >= dt$pos_min[dt$group == "A"] & df$value <= dt$pos_max[dt$group == "A"] # 手动生成B组判断列 df$B <- df$value >= dt$pos_min[dt$group == "B"] & df$value <= dt$pos_max[dt$group == "B"] # 手动生成C组判断列 df$C <- df$value >= dt$pos_min[dt$group == "C"] & df$value <= dt$pos_max[dt$group == "C"]
运行后输出:
> df ID group value A B C 1 1 A 12 TRUE FALSE FALSE 2 2 B 22 FALSE TRUE FALSE 3 3 A 16 FALSE FALSE FALSE 4 4 C 33 FALSE FALSE TRUE 5 5 B 18 FALSE FALSE FALSE
批量处理方案
方案1:Base R 循环实现
无需额外包,直接循环生成所有分组列:
# 获取所有分组标识 all_groups <- dt$group # 循环遍历每个分组,生成对应的判断列 for (g in all_groups) { # 提取当前分组的范围边界 min_val <- dt$pos_min[dt$group == g] max_val <- dt$pos_max[dt$group == g] # 生成判断列,列名与分组名一致 df[[g]] <- df$value >= min_val & df$value <= max_val }
方案2:dplyr + purrr 函数式实现
适合熟悉tidyverse生态的用户,代码更简洁:
library(dplyr) library(purrr) df_result <- df %>% mutate( # 为每个分组生成判断列 !!!map(set_names(dt$group), ~ { min_val <- dt$pos_min[dt$group == .x] max_val <- dt$pos_max[dt$group == .x] ~ .x >= min_val & .x <= max_val }) ) %>% # 调整列顺序,将判断列放在后面 select(ID, group, value, all_of(dt$group))
期望输出样式
两种批量方案最终都会生成与手动实现完全一致的结果:
ID group value A B C 1 1 A 12 TRUE FALSE FALSE 2 2 B 22 FALSE TRUE FALSE 3 3 A 16 FALSE FALSE FALSE 4 4 C 33 FALSE FALSE TRUE 5 5 B 18 FALSE FALSE FALSE
内容的提问来源于stack exchange,提问作者Alegría
相关产品推荐
相关产品推荐

