2016-06-08 113 views
0

我是R新手,正在努力寻找一些甚至可能没有被正确询问的东西,但这就是我现在最好的表达方式。 我有两个不同的CSV文件读入R. dataA1包含481242行和71列(即变量),其中一个是conm(即公司名称)。 dataB1包含715行(变量)1615行,其中一个是company.name。如何检查R中部分匹配的两个不同数据框中的两个字符串列?

来自dataB1的1615个公司名中的一部分与来自dataA1的481242个公司名中的一些部分或完全匹配(重叠)。

我的目标是,打造dataB1一栏在那里我将有1-S对于同样是在dataA1(部分或全部相同的名称),发现这些公司,并与0-S对于那些没有找到那里。

任何想法如何做到这一点?

给你一个更好的主意数据的样子,这里是dataA1

1-PAGE LTD 
3I GROUP PLC 
3I INFOTECH LTD 
401 HOLDINGS LTD 
4CS HOLDINGS CO LTD 
55 STATION INC 
600 GROUP PLC (THE) 
7DIGITAL GROUP PLC 

而且需要从dataB1匹配列:

1-Page Ltd 
180 Connect Inc 
3DLabs Inc., Ltd. 
3M France 
3U Holdings AG 
4Imprint Group Plc 
724 Solutions Inc 
7days music entertainment AG 
+0

你可以给你一些规则/提示你想要执行部分匹配吗?因为我甚至无法用手查看你的例子...... – digEmAll

+0

我的意思是部分匹配的意思是,具有相似但不完全相同名称的公司应该被耦合/匹配。例如,持股有限公司和持股股份公司基本上是同一家公司,但其名称是德国版(AG = Ltd),因此,由于其名称的主要部分重叠,因此应将其标识为匹配对。 可能有一种方法可以确定重叠百分比以将其声明为匹配对(例如80%或更多)。它取决于一种技术。我使用了80%的模糊查找匹配来执行此任务。唯一的问题是数据的大小对于excel来说太大 – Maiko

回答

0

我没有足够的细节,但我会考虑使用标志操作。一个标志,运营商只是标识了在矢量值出现在相应的数据帧,向量等。你的榜样,我会做这样的事情:

dataB1 <- toupper(dataB1) 
flag <- dataB1 %in% dataA1 

该代码会给出TRUE如果值是完全在dataA1中匹配,否则以矢量形式匹配FALSE

+0

谢谢akash87。这听起来不错,对于类似的任务肯定会有用。但是,如果该值完全匹配,则会得到TRUE。 在我的情况下,我需要部分匹配。例如,如果公司具有相同的名称,但是具有“ltd”。或“有限公司”或类似“1页有限公司”与“单页有限公司”等等,这些也需要被识别。 我目前使用Excel的模糊查找插件执行此任务。它运行良好,但由于数据非常大,我需要将它分成几个小块。本来很高兴在R中有类似的工具 – Maiko

0

您可以尝试amatchstringdist的功能,例如, :

library(stringdist) 

toSearch <- c("1-PAGE LTD","3I GROUP PLC","3I INFOTECH LTD","401 HOLDINGS LTD", 
       "4CS HOLDINGS CO LTD", "55 STATION INC","600 GROUP PLC (THE)", 
       "7DIGITAL GROUP PLC") 

lookupTable <- c("1-Page Ltd", "180 Connect Inc", "3DLabs Inc., Ltd.", 
       "3M France","3U Holdings AG", "4Imprint Group Plc", "724 Solutions Inc", 
       "7days music entertainment AG") 

acceptableDistanceThresh = 0.23 
lookupTableIndex <- amatch(toupper(toSearch), 
          toupper(lookupTable), 
          method='jw', 
          maxDist=acceptableDistanceThresh, 
          nthread = 4) 


res <- data.frame(toSearch, 
        lookupTableValue=lookupTable[res], 
        lookupTableIndex=lookupTableIndex) 

> res 
       toSearch lookupTableValue lookupTableIndex 
1   1-PAGE LTD   1-Page Ltd    1 
2  3I GROUP PLC    <NA>    NA 
3  3I INFOTECH LTD    <NA>    NA 
4 401 HOLDINGS LTD  3U Holdings AG    5 
5 4CS HOLDINGS CO LTD    <NA>    NA 
6  55 STATION INC    <NA>    NA 
7 600 GROUP PLC (THE)    <NA>    NA 
8 7DIGITAL GROUP PLC 4Imprint Group Plc    6 

在基本包有功能agrep其可以执行部分​​匹配,但它没有和矢量不是多线程。

相关问题