21

描述

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

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

B 中有 3 个字段,A 中有 4 个字段。公司名称(仅限文件 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 加拿大价值-D

在这些情况下,我必须选择没有序列化的那个,或者选择称为“A”、“-A”或“Advisor”的那个作为匹配项。

问题

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

想法

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

我考虑的另一种方法是根据资产、基金名称、资产类别和公司的组合创建匹配索引。但同样,我不确定如何用 R 来做到这一点。或者,就此而言,如果它甚至可能的话。

非常感谢代码、注释、想法和方向的示例!

4

4 回答 4

14

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

于 2016-07-07T13:36:37.417 回答
9

一个快速的建议:尝试在使用合并之前分别对不同的字段进行一些匹配。最简单的方法是使用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

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

于 2010-02-09T20:50:52.897 回答
3

近似字符串匹配不是一个好主意,因为不正确的匹配会使整个分析无效。如果每个来源的名称每次都相同,那么构建索引对我来说也是最好的选择。这很容易在 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
于 2010-02-10T04:13:38.187 回答
0

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

这是一个困难的问题,因为每个数据提供者都会为各个基金名称选择自己的表格。有些使用不同的结构,例如全部以基金或类别结尾,其他的则到处都是。每个人似乎也选择了自己的简短形式,并且这些形式经常变化。

这就是为什么有这么多人像你一样定期手工做这个。一些咨询公司确实列出了链接各种来源的索引,不确定您是否探索过这条路线?

正如 Shane 和 Marek 所指出的,这是一项匹配任务,而不是直接连接。许多公司都在为此苦苦挣扎。我正在这方面的工作中......

周杰伦

于 2010-02-09T21:11:23.580 回答