在R中使用模糊/近似字符串匹配合并两个数据帧

时间:2010-02-09 19:41:39

标签: r fuzzy-search

说明

我有两个数据集,其中包含我需要合并的信息。我所拥有的唯一常见字段是不完全匹配的字符串和可能大不相同的数字字段

解释问题的唯一方法是向您显示数据。这是a.csvb.csv。我正在尝试将B合并到A。

B中有三个字段,A中有四个字段。公司名称(仅文件A),基金名称,资产类别和资产。到目前为止,我的重点是尝试通过替换字符串的单词或部分来匹配基金名称以创建完全匹配,然后使用:

a <- read.table(file = "http://bertelsen.ca/R/a.csv",header=TRUE, sep=",", na.strings=F, strip.white=T, blank.lines.skip=F, stringsAsFactors=T) 
b <- read.table(file = "http://bertelsen.ca/R/b.csv",header=TRUE, sep=",", na.strings=F, strip.white=T, blank.lines.skip=F, stringsAsFactors=T)
merge(a,b, by="Fund.Name") 

然而,这只会让我达到约30%的匹配率。其余的我必须手工完成。

资产是一个数字领域,在任何一方都不总是正确的,如果基金资产较低,则可能会有很大差异。 Asset Class是一个字符串字段,在两个文件中“通常”相同,但是存在差异。

在文件B中添加了不同系列的资金。例如:

  

AGF加拿大价值

     

AGF Canadian Value-D

在这些情况下,我必须选择未经过服务的那个,或者选择名为“A”,“ - A”或“Advisor”的那个作为匹配。

问题

你认为最好的方法是什么?这个练习是我每月必须做的事情,手动匹配它是非常耗时的。代码示例将是有用的。

IDEAS

我认为可能有用的一种方法是根据字符串中每个单词的第一个大写字母来规范化字符串。但是我无法弄清楚如何使用R来解决这个问题。

我考虑的另一种方法是根据资产,基金名称,资产类别和公司的组合创建匹配指数。但同样,我不知道如何用R来做这件事。或者,就此而言,如果它甚至可能。

非常感谢代码,评论,想法和方向的例子!

4 个答案:

答案 0 :(得分:11)

强烈建议您使用dgrtwo/fuzzyjoin包。 stringdist_inner_join(a,b, by="Fund.Name")

答案 1 :(得分:8)

一个快速建议:在使用合并之前,尝试分别对不同的字段进行一些匹配。最简单的方法是使用pmatch函数,尽管R不缺少文本匹配函数(例如agrep)。这是一个简单的例子:

pmatch(c("med", "mod"), c("mean", "median", "mode"))

对于您的数据集,这会匹配a中的所有基金名称:

> nrow(merge(a,b,x.by="Fund.Name", y.by="Fund.name"))
[1] 58
> length(which(!is.na(pmatch(a$Fund.Name, b$Fund.name))))
[1] 238

创建匹配后,您可以轻松地将它们合并在一起。

答案 2 :(得分:2)

近似字符串匹配不是一个好主意,因为不正确的匹配会使整个分析无效。如果每个来源的名称每次都相同,那么构建索引对我来说似乎也是最好的选择。这很容易在R:

中完成

假设您有数据:

a<-data.frame(name=c('Ace','Bayes'),price=c(10,13))
b<-data.frame(name=c('Ace Co.','Bayes Inc.'),qty=c(9,99))

为每个源构建一个名称索引,可能使用pmatch等作为起点,然后手动验证。

a.idx<-data.frame(name=c('Ace','Bayes'),idx=c(1,2))
b.idx<-data.frame(name=c('Ace Co.','Bayes Inc.'), idx=c(1,2))

然后为每次运行合并使用:

a.rich<-merge(a,a.idx,by="name")
b.rich<-merge(b,b.idx,by="name")
merge(a.rich,b.rich,by="idx")

哪会给我们:

  idx name.x price     name.y qty
1   1    Ace    10    Ace Co.   9
2   2  Bayes    13 Bayes Inc.  99

答案 3 :(得分:1)

我也是加拿大本地人,认可基金名称。

这是一个困难的问题,因为每个数据提供商都会为各个基金名称选择自己的表格。有些人使用不同的结构,如基金或班级的所有结束,其他人都到处都是。每个人似乎也选择自己的短片,并且这些短片经常变化。

这就是为什么像你这么多人经常手工做这件事的原因。一些咨询公司确实列出了链接各种来源的索引,不确定你是否已经探索过这条路线?

正如Shane和Marek所指出的,这是一个匹配的任务而不是直接连接。许多公司正在努力解决这个问题。我正在处理这个......

相关问题