R语言查找两个dataframe列之间的部分匹配元素
R实现多值列部分匹配生成目标结果表
核心逻辑:判断Input表A列中以|分隔的各个子项,是否存在任意一个值命中Lookup表Matches列的内容,命中则Matched列标记为Yes,否则标记为No。
整词精确匹配方案(无匹配误差,最常用)
该方案会把A列的字符串按|拆分成独立值,再判断是否和Lookup表的匹配项有交集,不会出现子串误匹配的问题,适合绝大多数多值标签匹配场景:
# 初始化示例数据 A <- c("Green|Red|Yellow","Blue","Orange|Peach","Violet") B <- c(23,41,65,89) Input <- data.frame(A, B) Matches <- c("Green","Orange","Red","Yellow","Peach") Lookup <- data.frame(Matches) # 生成Matched列 Input$Matched <- ifelse( sapply(strsplit(as.character(Input$A), split = "\\|"), function(items) { any(items %in% Lookup$Matches) }), "Yes", "No" )
运行后输出结果如下:
A B Matched 1 Green|Red|Yellow 23 Yes 2 Blue 41 No 3 Orange|Peach 65 Yes 4 Violet 89 No
注:你给出的示例Result中Blue对应Matched为Yes,按当前提供的Lookup表数据"Blue"不在匹配项列表中,若需要Blue也标记为Yes,在Lookup的Matches向量中加入"Blue"即可。
正则快速匹配方案(适合大数据量场景)
如果数据量较大,对运行速度有要求,可以用正则表达式做匹配,加单词边界避免短词误匹配长词(比如把"Green"匹配到"Greenfield"里):
match_pattern <- paste0("\\b(", paste(Lookup$Matches, collapse = "|"), ")\\b") Input$Matched <- ifelse(grepl(match_pattern, Input$A), "Yes", "No")
运行结果和上述整词匹配方案完全一致。
内容的提问来源于stack exchange,提问作者ParthaSarathi
相关产品推荐
相关产品推荐

