如何基于全列正则匹配结果在R中新增标识匹配状态的新列
解决方案
方案1(推荐,适配dplyr 1.0.0及以上版本)
直接使用if_any()函数替代原来的any_vars(),同时对每列做字符类型转换兼容非字符串列:
library(tidyverse) # 替换df为你的数据集名称,正则规则可以按需修改 df <- df %>% mutate( match = if_else( if_any( .cols = everything(), .fns = ~ str_detect(as.character(.x), pattern = '(?i)string.*c5') ), true = "Match", false = "No Match" ) )
方案2(基于c_across实现,适配需要行分组的场景)
如果你更习惯用c_across语法,可以配合rowwise()实现:
df <- df %>% rowwise() %>% mutate( match = if_else( any(str_detect(as.character(c_across(everything())), '(?i)string.*c5'), na.rm = TRUE), "Match", "No Match" ) ) %>% ungroup() # 处理完成后取消行分组,避免影响后续数据操作
关键说明
- 所有匹配前都用
as.character()转换列值,自动兼容数值、逻辑值、日期等非字符串类型的列,不会触发类型不匹配报错 if_any()是官方推出的any_vars()替代函数,专门用于行级多列条件判断,直接返回逻辑向量,完美适配if_else()的参数要求- 若数据集存在NA值,可在
any()函数中添加na.rm = TRUE参数,避免NA值导致判断结果返回NA
内容的提问来源于stack exchange,提问作者Khashir
相关产品推荐
相关产品推荐

