繁体   English   中英

查找R中两个向量之间的部分匹配字符串

[英]Find partial matching strings between two vectors in R

我正在使用R中的两个字符串向量。

第一个, 所有者 ,包含大约100,000个元素,如下所示:

> proprietor
 [1] "GERALD RICA LIMITED"                                             
 [2] "EUROMASTER STUDIO SRL"                                           
 [3] "CENTRE D'ECHANGES INTERNATIONAUX (CEI)"                          
 [4] "RONTEC SERVICE STATION 1A LIMITED"                               
 [5] "MOORGARTH PROPERTIES (LUXEMBOURG) S.A.R.L"                       
 [6] "BEAVRON INVESTMENTS LIMITED"                                     
 [7] "MITRALI LIMITED" 

另一个名为name ,包含大约700,000个类似元素:

> name 
 [1] "MULTIPOINT HOLDINGS LIMITED"                                     
 [2] "NYASA PROPERTY LIMITED"                                          
 [3] "WHITE LODGE HOLDINGS LIMITED"                                    
 [4] "MULTIPOINT HOLDINGS LIMITED"                                     
 [5] "MULTIPOINT HOLDINGS LIMITED"                                     
 [6] "JBL INVESTMENT LIMITED"                                          
 [7] "DIMBLEBY LIMITED"                                                
 [8] "LIDL U.K. GMBH"     

考虑到可能存在一些错别字或例如“ LIMITED”之类的单词也可以写成“ LTD”,我想知道所有人名字也有名字

我已经尝试过的:

  • proprietor %in% name返回一个空元素,我知道不是这样

  • intersect(proprietor, name)不起作用,因为我的向量中有重复项

  • 主要是,我尝试使用agrep()进行循环以允许部分匹配:

    for (i in 1:97034) {
      if (is.null(agrep(proprietor[i], name, max.distance=0.1, value=TRUE, useBytes=TRUE, costs=NULL, ignore.case=TRUE))=="TRUE") {
        test[i] <- 1
      } else {
        test[i] <- agrep(proprietor[i], name, max.distance=0.1, value=TRUE, useBytes=TRUE, costs=NULL, ignore.case=TRUE)
      }
    }

它返回错误“ regcomp错误:'内存不足'”。 我是从R开始的,所以1)我可以看到此循环不是最简单的方法2)我没有得到如何纠正内存不足错误的方法。

  • 我还尝试了本文中给出的解决方案: 在R中的两个向量之间找到匹配的字符串,但我无法实现(错误消息:错误:断言'tree-> num_tags == num_tags'在执行正则表达式时失败:文件'tre- compile.c',第634行。我找不到它的来源。)

任何有关如何解决此问题的建议将不胜感激!

我将使用功能adist从包装stringdist

最小的工作示例:

创建一个无意义单词的向量,并将其称为:

a <- c("gkhk", "ololsol", "tyuil", "tyuio", "etytyuli")

修改一些单词(或多或少的修饰度),并将其称为向量b:

b <- c("gwrwkhk", "olseotyuioplsol", "thsyuil", "tasyuio", "etytyuli")

然后计算元素之间的距离

yourdistance <- adist(x = a, y = b, ignore.case = TRUE)

yourdistance将是一个计算元素之间距离的矩阵。

     [,1] [,2] [,3] [,4] [,5]
[1,]    3   15    7    7    8
[2,]    7    8    6    7    7
[3,]    7   10    2    3    5
[4,]    7   10    3    2    5
[5,]    8   11    5    5    0

例如,[5,]中的“ etytyuli”和b [,5]中的“ etytyuli”之间的距离将为0,因为我没有将该字符串从a修改为b。

一旦有了这个矩阵,就可以决定什么对您足够“接近”,并仅选择那些元素。 您还可以使用参数cost进行操作,该参数允许您为插入,删除或替换提供不同的成本。

您可能想了解更多有关此的信息:

https://www.r-bloggers.com/fuzzy-string-matching-a-survival-skill-to-tackle-unstructured-information/

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM