【发布时间】:2020-09-15 07:32:44
【问题描述】:
我正在尝试编写一个函数来检测表中的两个名称是否相似。假设一个条目是重复的,但写法不同:以下示例说明了这种情况
Ned Flanders and Nedd Flanders
Ned F and Ned F.
Ned Flanders and Nedd Flanders
Ned Flanders and Ned Flamders
我想创建一个函数,该函数能够检测两个名称的大部分字符是否相同,这发生在上面说明的情况中。问题是一个很长的名字可以包含一个小名字的所有字符,即使名字非常不同。
有什么办法解决这个问题吗?您不需要以 100% 的准确率进行检测,这只是确保没有重复的一种额外方法。
我知道该表应该有一个唯一键,但目前这是不可能的,并且考虑过滤器中的其他列不起作用,因为在某些情况下其他列也会发生变化。
duplicity_detect <- function(vec) {
duplicity<-data.frame(matrix(nrow = 0, ncol = 2))
colnames(duplicity)<-c('name','nome similar')
for (i in 1:(length(vec)-1)){
for (j in (i+1):length(vec)){
x<-strsplit(gsub(x = vec[i],pattern = " ",replacement = ""),split = "")[[1]]
y<-strsplit(gsub(x = vec[j],pattern = " ",replacement = ""),split = "")[[1]]
intersec <- x[x %in% intersect(x, y)]
if (length(intersec)>0.99*length(x) | length(intersec)>0.99*length(y)){
duplicity[nrow(duplicity) + 1,] = c(vec[i],vec[j])
}
}
}
return(duplicity)
}
编辑:
我按照@Shan R的思路重写了函数
duplicity_detect <- function(vec) {
duplicity <- lapply(vec, FUN = agrep, vec, value = T)
duplicity <- duplicity[lapply(duplicity, length) > 1]
return(duplicity)
}
【问题讨论】:
-
试试agrep,近似匹配。 agrep(pattern, x, ignore.case = FALSE, value = FALSE, max.distance = 0.1)
-
你在读什么类型的表?该函数是否需要从表中读取或仅检查相似性?
-
你可以考虑一个data.frame,想法是过滤一个包含名字的列
-
事实上我想获得一个名称相似的新data.frame,这样我就可以确定它是否是重复条目