部分字符串合并R大数据集

时间:2015-03-10 22:26:18

标签: r merge match

[更新如下]

我想基于通用名称将大数据集(112兆)与较小的数据集(<1mg)合并。名称是两个数据集之间的不精确匹配。 stackoverflow上有许多关于部分匹配或管理大型数据集的教程,但两者都没有。当标准的部分匹配方法应用于非常大的数据集时,R倾向于冻结。以下是一些可复制的数据。

在大型数据集中,名称以全部大写字母显示,姓氏优先,偶尔有后缀(即。)

JUDE, RICHARD J. MR.

在较小的数据集中,它们符合标准&#34;名字姓氏&#34;格式没有逗号或后缀。每个名字都有相关的变量,例如他们给政治候选人多少钱,或者他们为哪个公司工作。

df1$x <- c("JAYSHREE, JOHNSON D. JR.", "JAMESON, KATHERINE", "TOMMEND, LEONARD"),
df1$p <- c(100, 200, 300)

df2$y <- c("Leo Tommend", "Jay Johnson", "Kathy Jameson")
df2$c <- c("Apple", "Google", "Facebook")

假设x有几百万行,y有几千行。我尝试过另外一个教程(here)中的grepl,pmatch和一个专门的算法,但是当我尝试这些教程时,R会挂起。我已经加载了带有data.table的X帧以获得速度。

如果有帮助,我会错误地向合并的数据框添加许多行。如果我能做些什么来使这个问题更容易回答,请在评论中告诉我。谢谢你的帮助

[更新

感谢评论者,我能够将比赛数量减少到大约20,000,但这仍然很多。我已经包含了这两个文件的链接。这两个文件是1)。每个在2012年进行政治捐赠的人和2)。每个互联网创始人的名字。

https://www.dropbox.com/sh/x6tk1pujvfn0fnb/AACQyuICbJPR7VdDf3bbdIwwa?dl=0

当我申请@ BondedDust的代码时,它显着缩小了!但是仍有数十个重复的名字。所以,例如,如果&#34; Aaron&#34;成立了一家公司,每个人都以#34; Aaron&#34;将被添加,新文件假设有100人创建了同一家公司,每个人都是#A; Aaron&#34;给了一位不同的政治家。

目标是仅将每个互联网创始人的独特实例与其政治贡献相匹配。我可能需要向匹配算法添加更多数据而不仅仅是他们的名字(可能包括他们的位置,但这是有问题的,因为许多互联网创始人有多个家庭)

我希望这有用!

1 个答案:

答案 0 :(得分:1)

以下是一个镜头:使用名字的前三个字母和完整的姓氏作为匹配条件:

df1$xsub= gsub("^([^,]+)\\, (.{3})(.+)", "\\2 \\1", tolower(df1$x) )
df2$ysub= gsub("^(.{3})([^ ]+) (.+)", "\\1 \\3", tolower(df2$y) )


 merge(df1,df2, by.x="xsub", by.y="ysub")

#----------------
         xsub                  x   p             y        c
1 kat jameson JAMESON, KATHERINE 200 Kathy Jameson Facebook
2 leo tommend   TOMMEND, LEONARD 300   Leo Tommend    Apple

还有一个Soundex函数(soundex)在pkg:RecordLinkage的“语音帮助”页面中描述,这可能有助于拼写相似的名称,例如。凯瑟琳和凯茜,或约翰和乔恩。我没有任何缩短Soundex密钥的经验,但可能有机会在这项工作的基础上进行。