1

我有一个调查数据集,其中受访者描述了他们活动的位置,通常是城镇或城市名称。我想识别命名城市的每个唯一提及并计算每个城市被提及的次数。最终输出应该是一个向量,其中包含每个城市被提及的次数。一个挑战是城市名称可能拼写错误、大小写奇怪或嵌入更长的字符串中(其中可能还包括多个城市)。我有一个具有正确大小写和拼写的城市名称的主列表,我一直在尝试将其用作 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
4

1 回答 1

2

主要问题是您{}在 for 循环周围缺少一个块。您实际上只进行了idx5 次初始化并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=它以使其成为比例而不是绝对数字。然而,就使它们匹配所需的删除数量而言,“曼彻斯特”看起来仍然与“海边的曼彻斯特”有太大的不同。您可以考虑降低权重删除

于 2014-07-25T22:52:05.170 回答