【发布时间】:2012-10-21 16:31:00
【问题描述】:
使用 R,我正在尝试匹配按年份和城市构成的数据集中的人名。由于一些拼写错误,无法完全匹配,所以我尝试使用 agrep() 来模糊匹配名称。
数据集的一个样本块的结构如下:
df <- data.frame(matrix( c("1200013","1200013","1200013","1200013","1200013","1200013","1200013","1200013", "1996","1996","1996","1996","2000","2000","2004","2004","AGUSTINHO FORTUNATO FILHO","ANTONIO PEREIRA NETO","FERNANDO JOSE DA COSTA","PAULO CEZAR FERREIRA DE ARAUJO","PAULO CESAR FERREIRA DE ARAUJO","SEBASTIAO BOCALOM RODRIGUES","JOAO DE ALMEIDA","PAULO CESAR FERREIRA DE ARAUJO"), ncol=3,dimnames=list(seq(1:8),c("citycode","year","candidate")) ))
简洁版:
citycode year candidate
1 1200013 1996 AGUSTINHO FORTUNATO FILHO
2 1200013 1996 ANTONIO PEREIRA NETO
3 1200013 1996 FERNANDO JOSE DA COSTA
4 1200013 1996 PAULO CEZAR FERREIRA DE ARAUJO
5 1200013 2000 PAULO CESAR FERREIRA DE ARAUJO
6 1200013 2000 SEBASTIAO BOCALOM RODRIGUES
7 1200013 2004 JOAO DE ALMEIDA
8 1200013 2004 PAULO CESAR FERREIRA DE ARAUJO
我想分别检查每个城市,几年后是否有候选人出现。例如。在示例中,
保罗·塞扎尔·费雷拉·德·阿劳霍
保罗·塞萨尔·费雷拉·德·阿劳霍
出现两次(有拼写错误)。应为整个数据集中的每个候选人分配一个唯一的数字候选人 ID。数据集相当大(5500 个城市,大约 100K 条目),因此稍微有效的编码会有所帮助。关于如何实现这一点的任何建议?
编辑:这是我的尝试(到目前为止,在 cmets 的帮助下)完成手头的任务非常缓慢(效率低下)。对此有何改进建议?
f <- function(x) {matches <- lapply(levels(x), agrep, x=levels(x),fixed=TRUE, value=FALSE)
levels(x) <- levels(x)[unlist(lapply(matches, function(x) x[1]))]
x
}
temp <- tapply(df$candidate, df$citycode, f, simplify=TRUE)
df$candidatenew <- unlist(temp)
df$spellerror <- ifelse(as.character(df$candidate)==as.character(df$candidatenew), 0, 1)
编辑 2:现在以良好的速度运行。问题是在每一步都与许多因素进行比较(感谢蓝魔导师指出这一点)。将比较减少到仅一组(即一个城市)中的候选人在 5 秒内运行 80,000 行命令 - 这是我可以接受的速度。
df$candidate <- as.character(df$candidate)
f <- function(x) {x <- as.factor(x)
matches <- lapply(levels(x), agrep, x=levels(x),fixed=TRUE, value=FALSE)
levels(x) <- levels(x)[unlist(lapply(matches, function(x) x[1]))]
as.character(x)
}
temp <- tapply(df$candidate, df$citycode, f, simplify=TRUE)
df$candidatenew <- unlist(temp)
df$spellerror <- ifelse(as.character(df$candidate)==as.character(df$candidatenew), 0, 1)
【问题讨论】:
-
到目前为止您尝试过什么?让
agrep匹配或有效地进行匹配有问题吗? -
主要是效率部分。我遍历了所有城市和候选人,但这需要很长时间。我能够在每个城市中找到模糊匹配,但很难在整个数据集中创建唯一 ID。
-
你能贴出你的循环代码吗?另见stackoverflow.com/questions/2908822/…。
-
我的循环是 || for (i in 1:dim(df)[1]){ df$match[i] = sort(agrep(df$candidate[i], df$candidate, ignore.case = FALSE, value = TRUE, max.distance = 0.1))[1]} df$candid
标签: r string-matching fuzzy agrep