如何在R中实现数据集列的部分匹配并添加Y/N标记列
解决方案
你原来的代码存在两个问题:
Y和N未加引号,R会将其视为变量引发报错,需改为字符串"Y"和"N";%in%仅支持精确匹配,无法处理B列中逗号分隔的多值场景,需要先把这类多值拆分为单个选项再匹配。
以下是可行的处理代码:
library(dplyr) library(stringr) # 1. 整理B中所有候选匹配项 match_candidates <- B %>% select(5, 6) %>% # 选取B的第5、6列 pivot_longer(cols = everything(), values_to = "item") %>% # 将两列合并为单列 mutate(item = str_split(item, ",")) %>% # 按逗号拆分多值内容 unnest(item) %>% # 把拆分后的列表展开为单个元素行 mutate( item = trimws(item), # 去除选项前后空格 item = str_remove_all(item, "\\(|\\)") # 去除括号(无括号可删除此行) ) %>% pull(item) %>% # 提取为向量 unique() # 去重减少重复检查 # 2. 给A添加Match列 A <- A %>% mutate( # 统一A第4列的格式(和候选项处理逻辑一致) target = trimws(str_remove_all(.[[4]], "\\(|\\)")), # 判断是否匹配并生成Y/N Match = ifelse(target %in% match_candidates, "Y", "N") ) %>% select(-target) # 删除中间临时列(不需要可保留)
说明
- 先将B中所有可能的匹配项拆分为单个元素,统一格式(去空格、去括号),确保后续能通过
%in%完成精确匹配; - 对A的第4列做相同格式处理,避免因格式差异(如空格、括号)导致匹配失败;
- 你的示例场景中:A$4的
(CR2)处理后为CR2,B$6的(CR1,CR2)拆分处理后得到CR1和CR2,因此CR2会命中候选列表,最终Match列值为Y。
内容的提问来源于stack exchange,提问作者BenMar16
相关产品推荐
相关产品推荐

