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

如何编写循环判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:10:32