Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 检测重复条目_R_String_Filter - Fatal编程技术网

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的任何条目都有一个类似的名称。将尝试更新代码。我通过添加新函数编辑了我的问题,我仍然需要检查更多详细信息,但它似乎工作得很好。我更新了解决方案以筛选列表。因为这对您有用,请考虑通过单击答案旁边的灰色复选标记来接受该解决方案。