R语言基于两列字符串匹配新增列(兼容NA值)实现方法
R中基于多列联合正则匹配新增岗位标识列方案
需求说明
现有人员岗位数据集结构如下:
NAME JOB TITLE ROLE DESCRIPTION Mark Cyber specialist N/A Peter Manager Manager with focus on cyber Steven CFO N/A Lucas VP General manager technology safety
需要新增Cyber Job列标识岗位是否为网络相关:
- Mark、Peter、Lucas所在行值为1(代表网络相关)
- 判断逻辑需同时参考
JOB TITLE、ROLE DESCRIPTION两列内容,兼容字段存在N/A/空值的场景
已知单列正则匹配实现代码如下,缺少两列联合判断的写法:
pattern <- paste(c("cyber", "Cyber", "technology", "Technology", "computer", "Computer"), collapse = "|") df <- df %>% mutate(`Cyber Job` = ifelse(str_detect('column', pattern), 1, 0))
实现代码
先优化匹配规则:正则匹配开启忽略大小写参数,无需手动枚举关键词的大小写变体,简化代码。两列判断采用任意一列命中关键词即标记为1的逻辑,同时对匹配产生的NA值做兜底处理,避免字段为N/A时计算出错。
library(tidyverse) # 定义匹配规则,忽略大小写 match_pattern <- regex("cyber|technology|computer", ignore_case = TRUE) df <- df %>% mutate( # 两列做逻辑或判断,任意一列命中即为TRUE,转整数后TRUE对应1、FALSE对应0 `Cyber Job` = as.integer( str_detect(`JOB TITLE`, match_pattern) | str_detect(`ROLE DESCRIPTION`, match_pattern) ), # 字段为N/A导致的匹配结果NA,统一替换为0(未命中) `Cyber Job` = replace_na(`Cyber Job`, 0) )
结果验证
运行代码后输出完全符合预期:
- Mark:
JOB TITLE含"Cyber"命中,标记为1 - Peter:
ROLE DESCRIPTION含"cyber"命中,标记为1 - Lucas:
ROLE DESCRIPTION含"technology"命中,标记为1 - Steven:两列均无匹配关键词,标记为0
- 所有N/A字段不会触发报错,均按未命中关键词正常处理。
内容的提问来源于stack exchange,提问作者Robbert
相关产品推荐
相关产品推荐

