gpt4 book ai didi

r - 通过名称模糊匹配创建唯一 ID(通过使用 R 的 agrep)

转载 作者:行者123 更新时间:2023-12-02 15:56:49 26 4
gpt4 key购买 nike

使用 R,我尝试匹配按年份和城市构建的数据集中的人名。由于一些拼写错误,无法精确匹配,因此我尝试使用 agrep() 来模糊匹配名称。

数据集的示例 block 的结构如下:

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

我想分别查询每个城市,几年内是否有候选人出现。例如。在示例中,

PAULO CEZAR FERREIRA DE ARAUJO

PAULO CESAR FERREIRA DE ARAUJO

出现两次(有拼写错误)。整个数据集中的每个候选者都应分配一个唯一的数字候选者 ID。该数据集相当大(5500 个城市,大约 100K 条目),因此稍微有效的编码会有所帮助。关于如何实现这一点有什么建议吗?

编辑:这是我的尝试(在迄今为止的评论的帮助下),它在完成手头的任务方面非常缓慢(效率低下)。有什么改进建议吗?

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:现在运行速度很快。问题在于每一步都要与许多因素进行比较(感谢 Blue Magister 指出这一点)。将比较减少为仅与一组(即一个城市)中的候选者进行比较,可以在 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)

最佳答案

这是我的尝试。它可能不是很有效,但我认为它会完成工作。我假设 df$candidates 具有类别因素。

#fuzzy matches candidate names to other candidate names
#compares each pair of names only once
##by looking at names that have a greater index
matches <- unlist(lapply(1:(length(levels(df[["candidate"]]))-1),
function(x) {max(x,x + agrep(
pattern=levels(df[["candidate"]])[x],
x=levels(df[["candidate"]])[-seq_len(x)]
))}
))
#assigns new levels (omits the last level because that doesn't change)
levels(df[["candidate"]])[-length(levels(df[["candidate"]]))] <-
levels(df[["candidate"]])[matches]

关于r - 通过名称模糊匹配创建唯一 ID(通过使用 R 的 agrep),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12999772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com