在R中,如何使用模糊匹配来搜索多个模式?

时间:2014-07-25 22:30:02

标签: r for-loop fuzzy-search agrep

我有一个调查数据集,其中受访者描述了他们活动的位置,通常是城镇或城市名称。我想确定每个指定城市的唯一提及,并计算每个城市被提及的次数。最终输出应该是一个向量,其中包含每个城市被提及的次数。一个挑战是城市名称可能拼写错误,具有奇数大写,或嵌入更长的字符串(也可能包括多个城市)。我有一个城市名称的主列表,其中包含适当的大写和拼写,我一直试图将其用作agrep函数的模式。

数据集的样本块结构如下:

survey <- c("Salem", "salem, ma","Manchester","Manchester-By-The-Sea")
master <- c("Beverly","Gloucester","Manchester-by-the-Sea","Nahant","Salem")

在此示例中,最终结果将是向量:

result
[1] 0 0 2 0 2

我一直在尝试使用agrep构建一个函数来遍历主矢量,以便在搜索矢量中搜索匹配项,计算匹配项数,然后输出主矢量的每个项目的匹配项数。 这是我到目前为止,但我得到的是NULL。不确定我做错了什么和/或是否有更好的方法来解决这个问题。

idx <- NULL
matches <- NULL
n.match <- function(pattern, x, ...) {
for (i in 1:length(pattern))
   idx <- vector()
   idx <- agrep(pattern[i],x,ignore.case=TRUE, value=FALSE, max.distance = 2)
   matches[i] <- length(idx)
}
n.match(master,survey)
matches

1 个答案:

答案 0 :(得分:1)

主要问题是你在for循环中缺少一个块{}。您实际上只是初始化idx 5次并将i设置为5.此外,没有理由在您的函数内部保留所需的变量。 <怎么样

survey <- c("Salem", "salem, ma","Manchester","Manchester-By-The-Sea")
master <- c("Beverly","Gloucester","Manchester-by-the-Sea","Nahant","Salem")

n.match <- function(pattern, x, ...) {
    matches <- numeric(length(pattern))
    for (i in 1:length(pattern)) {
       idx <- agrep(pattern[i],x,ignore.case=TRUE, max.distance = 2)
       matches[i] <- length(idx)
    }
    matches       
}
n.match(master,survey)
# [1] 0 0 1 0 2

在这里,我还使用max.distance=来使其成为一个比例,而不是一个绝对数字。然而它仍然看起来像#34;曼彻斯特&#34;与#34;曼彻斯特海边&#34;太不一样了。就使它们匹配所需的删除次数而言。您可以考虑降低权重删除