【发布时间】:2020-12-03 10:35:50
【问题描述】:
我正在尝试通过将混乱的网站名称列表与已批准的列表进行匹配来清理数据库。
例如,首选站点名称可能是“Cotswold Water Park Pit 28”,但该站点已输入数据库中:“Pit 28”、“28”、“CWP Pit 28”和“Cotswold 28” '。
数据看起来像这样:
approved <- c("Cotswold Water Park Pit 28", "Cotswold Water Park Pit 14", "Robinswood Hill")
messy <- c("Pit 28", "28", "CWP Pit 28", "Cotswold 28", "14", "Robinswood")
我正在寻找一种方法来匹配messy 中每个元素中的单词/数字(非空格字符的簇)与approved 中每个元素中的单词/数字。理想情况下,我会得到这样的结果:
Cotswold Water Park Pit 28 Cotswold Water Park Pit 14 Robinswood Hill
[1,] "Pit 28" "Pit 28" "Robinswood"
[2,] "28" "CWP Pit 28" NA
[3,] "CWP Pit 28" "14" NA
[4,] "Cotswold 28" NA NA
approved 元素构成列名,messy 中包含匹配单词/数字的任何元素都出现在该列的单元格中。我知道会有一些错误的匹配。这很好,我可以稍后手动过滤它们,并且可能会从模式匹配中排除“森林”和“山丘”等常用词。
通过使用regex 拆分messy 中的每个元素,我已经能够使用上述示例数据获得我想要的结果,但是我正在处理来自站点名称列表的单词/数字列表和我不得不使用嵌套循环或sapply 将它们与已批准的元素匹配,因为像grep、grepl 和str_detect 这样的函数只允许一种模式。由于数据库很大,当我将它应用于整个事情时,这需要很长时间。我真正想要的是一个功能:
match(any word in approved[1], any word in messy[1])
如果匹配,给我一个TRUE FALSE 输出或提取messy[1] 会很棒!
【问题讨论】:
-
为什么
"Cotswold 28"与"Cotswold Water Park Pit 14"不匹配?"Cotswold"是它们之间的共同点。
标签: r regex string string-matching stringr