如何编写循环判断DataFrame多列值是否在指定两列区间并输出1/0
优化DataFrame多列区间判断的方法
针对你需要判断多列是否处于X、Y区间并生成1/0结果的需求,这里有几个更简洁高效的优化方案,避免创建大量中间列:
方案1:用across+rowSums快速判断
直接批量处理所有测试列,通过行求和判断是否有满足条件的列,一步生成结果并删除测试列:
library(tidyverse) set.seed(123) # 固定随机种子,结果可复现 df3 = data.frame(X = sample(1:3, 15, replace = TRUE), Y = sample(1:3, 15, replace = TRUE), Z = sample(1:3, 15, replace = TRUE), A = sample(1:3, 15, replace = TRUE)) df3_optimized <- df3 %>% # 对Z、A列批量判断是否在[X,Y]区间,行求和后判断是否大于0,转成1/0 mutate(check = as.integer(rowSums(across(c(Z, A), ~ .x >= X & .x <= Y)) > 0)) %>% select(-c(Z, A)) # 删除被测试的列
方案2:Reduce+across实现任意列满足条件
如果需要严格匹配你原来用Reduce做逻辑或的思路,也可以直接在mutate里完成,不用先创建中间列:
df3_optimized <- df3 %>% mutate(check = as.integer(Reduce(`|`, across(c(Z, A), ~ .x >= X & .x <= Y)))) %>% select(-c(Z, A))
方案3:自动匹配所有测试列(无需指定列名)
如果测试列是除X、Y外的所有列,用排除法批量处理,不管新增多少测试列都不用改代码:
df3_optimized <- df3 %>% mutate(check = as.integer(Reduce(`|`, across(-c(X, Y), ~ .x >= X & .x <= Y)))) %>% select(X, Y, check) # 直接保留需要的列,等价于删除测试列
优化亮点
- 省去了创建T1、T2等大量中间布尔列的步骤,代码更简洁且节省内存
- 批量处理测试列,不用重复编写
mutate语句 - 一步完成计算和列清理,流程更顺畅
内容的提问来源于stack exchange,提问作者gered
相关产品推荐
相关产品推荐

