R 检测重复条目
我试图编写一个函数来检测表中的两个名称是否相似。假设一个条目是重复的,但编写方式不同:下面的示例说明了这种情况R 检测重复条目,r,string,filter,R,String,Filter,我试图编写一个函数来检测表中的两个名称是否相似。假设一个条目是重复的,但编写方式不同:下面的示例说明了这种情况 Ned Flanders and Nedd Flanders Ned F and Ned F. Ned Flanders and Nedd Flanders Ned Flanders and Ned Flamders 我想创建一个函数,它能够检测两个名称的大多数字符是否相同,如上图所示。问题是,很长的名称可能包含较小名称的所有字符,即使名称非常不同 有办法解决这个问题吗?您不需要10
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)
}
编辑:
我按照@山河
duplicity_detect <- function(vec) {
duplicity <- lapply(vec, FUN = agrep, vec, value = T)
duplicity <- duplicity[lapply(duplicity, length) > 1]
return(duplicity)
}
您在文本挖掘中寻找的概念是余弦相似性。它适用于很长的文档和很短的单个单词 我个人无法担保,但看看textmineR软件包。小插曲如下:
在文本挖掘中,您要寻找的概念是余弦相似性。它适用于很长的文档和很短的单个单词 我个人无法担保,但看看textmineR软件包。小插曲如下:
这似乎还行。它认识到John Doe不是对手,并且知道John Doe和Jcob是不同的:
x <- c("Ned Flanders","Ned F", "Ned F.", "Ned Flamders", "John Doe", "Jacob Boyun")
y <- lapply(x, FUN = agrep, x, value = T)
unique(y[(lapply(y,length) > 1)])
这看起来不错。它认识到John Doe不是对手,并且知道John Doe和Jcob是不同的:
x <- c("Ned Flanders","Ned F", "Ned F.", "Ned Flamders", "John Doe", "Jacob Boyun")
y <- lapply(x, FUN = agrep, x, value = T)
unique(y[(lapply(y,length) > 1)])
您可以考虑使用Python Deffib包和导入。 这个类比较任何类型的序列,只要它是可散列的。 .ratio以介于0.0和1.0之间的浮点形式返回序列相似性的度量
1.0将被证明是相同的from difflib import SequenceMatcher
def check_similarity(col_a, col_b):
return SequenceMatcher(None, col_a, col_b).ratio()
print(check_similarity('Ned Flanders', 'Nedd Flanders'))
print(check_similarity('Neds Flanders', 'Nedd Flanders'))
print(check_similarity('Ned Flanders', 'Ned Flanders'))
您可以考虑使用Python Deffib包和导入。 这个类比较任何类型的序列,只要它是可散列的。 .ratio以介于0.0和1.0之间的浮点形式返回序列相似性的度量
1.0将被证明是相同的from difflib import SequenceMatcher
def check_similarity(col_a, col_b):
return SequenceMatcher(None, col_a, col_b).ratio()
print(check_similarity('Ned Flanders', 'Nedd Flanders'))
print(check_similarity('Neds Flanders', 'Nedd Flanders'))
print(check_similarity('Ned Flanders', 'Ned Flanders'))
尝试一个近似匹配。agreppattern,x,ignore.case=FALSE,value=FALSE,max.distance=0.1您从哪种类型的表中读取?函数是否需要从表中读取或只是检查相似性吗?您可以考虑DATA框架,其想法是筛选包含命名空间的列,事实上,我希望得到一个具有相似名称的新DATA框架,这样我就可以判断它是重复的条目还是不尝试的ADRIP,近似匹配。agreppattern,x,ignore.case=FALSE,value=FALSE,max.distance=0.1您从哪种类型的表中读取?函数是否需要从表中读取或者只是检查相似性吗?你可以考虑一个DATA框架,这个想法是过滤一个包含命名空间的列,事实上,我想得到一个具有相似名称的新DATA框架,这样我就可以判断它是一个重复的条目,还是不在这里进行测试,显然它工作得很好。是否有办法筛选此列表并仅收集检测到另一个类似列表的名称?长度>1的任何条目都有一个类似的名称。将尝试更新代码。我通过添加新函数编辑了我的问题,我仍然需要检查更多详细信息,但它似乎工作得很好。我更新了解决方案以筛选列表。因为这对你来说是有效的,所以你可以通过点击答案旁边的灰色复选来接受这个解决方案。是否有办法筛选此列表并仅收集检测到另一个类似列表的名称?长度>1的任何条目都有一个类似的名称。将尝试更新代码。我通过添加新函数编辑了我的问题,我仍然需要检查更多详细信息,但它似乎工作得很好。我更新了解决方案以筛选列表。因为这对您有用,请考虑通过单击答案旁边的灰色复选标记来接受该解决方案。