我有一个调查数据集,其中受访者描述了他们活动的位置,通常是城镇或城市名称。我想确定每个指定城市的唯一提及,并计算每个城市被提及的次数。最终输出应该是一个向量,其中包含每个城市被提及的次数。一个挑战是城市名称可能拼写错误,具有奇数大写,或嵌入更长的字符串(也可能包括多个城市)。我有一个城市名称的主列表,其中包含适当的大写和拼写,我一直试图将其用作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
答案 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;太不一样了。就使它们匹配所需的删除次数而言。您可以考虑降低权重删除