使用dplyr的across()检测多列中超出范围的值
解决方案
可以结合dplyr的if_any()和starts_with()函数实现需求,无需手动罗列列名,代码如下:
library(dplyr) # 原始数据 data <- tibble(a = letters[1:4], b1 = 10:13, b2 = 10:13, b3 = c(9, 4, 11, 10), b4 = c(50, 10:12)) # 重命名阈值变量,避免和R内置函数冲突 min_val <- 9 max_val <- 15 # 添加标记列 data <- data %>% mutate(is_unexpected = if_any(starts_with("b"), ~ .x < min_val | .x > max_val))
关键逻辑说明
starts_with("b"):自动匹配所有以b开头的列,替代手动罗列列名的繁琐写法。if_any():检查每行中任意一个目标列是否满足条件(值小于min_val或大于max_val),只要有一列符合,该行的is_unexpected就标记为TRUE,否则为FALSE。- 把原变量名
min/max改为min_val/max_val:避免和R内置的min()/max()函数重名引发错误。
运行结果
执行代码后,数据将新增标记列,结果如下:
data # A tibble: 4 × 6 a b1 b2 b3 b4 is_unexpected <chr> <int> <int> <dbl> <dbl> <lgl> 1 a 10 10 9 50 TRUE 2 b 11 11 4 10 TRUE 3 c 12 12 11 11 FALSE 4 d 13 13 10 12 FALSE
内容的提问来源于stack exchange,提问作者DanielMc
相关产品推荐
相关产品推荐

