在R中使用Fuzzy /近似string匹配合并两个dataframe

描述

我有两个数据集,需要合并的信息。 我唯一的共同领域是不完美匹配的string和数字领域,可以有很大的不同

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

公司名称(仅文件A),基金名称,资产类别和资产。 到目前为止,我的工作重点是试图通过replace单词或部分string来匹配基金名称,以创build精确匹配,然后使用:

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%的匹配。 其余的我必须手工完成。

资产是一个数字领域,两者并不总是正确的,如果基金资产低,可能会大幅度变化。 资产类是两个文件中“一般”相同的string字段,但是存在差异。

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

AGF加拿大价值

AGF加拿大价值-D

在这种情况下,我必须select一个不被选中的选项,或者select一个名为“A”,“-A”或“Advisor”的选项作为匹配项。

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

IDEAS

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

我考虑的另一种方法是创build一个基于资产,基金名称,资产类别和公司的组合匹配指数。 但是,我不知道如何用R来做到这一点。或者就此而言,甚至是可能的。

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

近似的string匹配不是一个好主意,因为错误的匹配会使整个分析无效。 如果每个来源的名称每次都是相同的,那么build立索引似乎也是我的最佳select。 这很容易在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)) 

为每个源创build一个名称索引,也许使用pmatch等作为起点,然后手动validation。

 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 

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

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

对于你的数据集,这匹配所有的基金名称:

 > 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 

一旦你创build了匹配,你可以轻松地将它们合并在一起。

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

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

这是一个困难的问题,因为每个数据提供者都会为各个基金名称select自己的forms。 有的使用不同的结构,比如所有的基金或者类别都结束了。 每个人似乎也select自己的短格式,并定期更换。

这就是为什么像你这样的很多人正在定期做这个。 一些咨询公司会列出索引链接各种来源,不知道你是否探索过这条路线?

正如Shane和Marek指出的,这不仅仅是一个直接的连接。 许多公司正在为此而苦苦挣扎。 我正在做这个工作

松鸦