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

在R中,如何使用模糊匹配来搜索多个模式?,r,for-loop,fuzzy-search,agrep,R,For Loop,Fuzzy Search,Agrep,我有一个调查数据集,其中受访者描述了他们活动的地点,通常是城镇或城市名称。我想识别每个被命名城市的独特提及,并计算每个城市被提及的次数。最终输出应该是一个向量,其中包含每个城市被提及的次数。一个挑战是城市名称可能拼写错误,大写字母不规则,或者嵌入更长的字符串(也可能包含多个城市)。我有一个城市名称的主列表,带有适当的大写字母和拼写,我一直试图用它作为我的agrep函数模式 数据集的样本块的结构如下所示: survey <- c("Salem", "salem, ma","Mancheste

我有一个调查数据集,其中受访者描述了他们活动的地点,通常是城镇或城市名称。我想识别每个被命名城市的独特提及,并计算每个城市被提及的次数。最终输出应该是一个向量,其中包含每个城市被提及的次数。一个挑战是城市名称可能拼写错误,大写字母不规则,或者嵌入更长的字符串(也可能包含多个城市)。我有一个城市名称的主列表,带有适当的大写字母和拼写,我一直试图用它作为我的agrep函数模式

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

survey <- c("Salem", "salem, ma","Manchester","Manchester-By-The-Sea")
master <- c("Beverly","Gloucester","Manchester-by-the-Sea","Nahant","Salem")
我一直在尝试使用agrep构造一个函数来循环主向量,以便它在测量向量中搜索匹配项,计算匹配项的数量,然后输出主向量中每个项的匹配项的数量。 这是我到目前为止得到的,但我得到的都是空的。不确定我做错了什么和/或是否有更好的方法解决这个问题

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

idx主要问题是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
调查
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