部分字符串合并R大数据集
Partial string merge R large dataset
[更新如下]
我想根据通用名称将大型数据集 (112 megs) 与较小的数据集 (<1mg) 合并。两个数据集之间的名称不完全匹配。有许多关于 Whosebug 的教程用于部分匹配或管理大型数据集,但不是两者都适用。当部分匹配的标准方法应用于非常大的数据集时,R 趋于冻结。下面是一些可复制的数据。
在大型数据集中,姓名全部大写,姓在前,偶尔带有后缀(即)
JUDE, RICHARD J. MR.
在较小的数据集中,它们采用标准 "First Name Last Name" 格式,没有逗号或后缀。每个名字都有相关的变量,例如他们给政治候选人多少钱,或者他们在哪家公司工作。
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有几千行。我尝试过 grepl、pmatch 和另一个教程中的专门算法 (here),但是当我尝试这些时 R 挂起。为了提高速度,我已经用 data.table 加载了 X 框架。
如果有帮助的话,我宁愿向合并的数据框中添加许多行。如果有什么我可以做的让这个问题更容易回答,请在评论中告诉我。谢谢你的帮助
[更新]
多亏了评论者,我才能够将匹配的数量减少到大约 20,000,但这仍然远远不够。我在这两个文件中包含了 link。这两个文件是 1)。 U.S 中的每个人。谁在 2012 年进行了政治捐赠和 2)。每个互联网创始人的名字。
https://www.dropbox.com/sh/x6tk1pujvfn0fnb/AACQyuICbJPR7VdDf3bbdIwwa?dl=0
当我应用@BondedDust 的代码时,它明显缩小了!但仍有数十个重名。因此,例如,如果 "Aaron" 创立了一家公司,将添加名为 "Aaron" 的每个人,并且新文件假定 100 人创立了同一家公司,并且每个 "Aaron" 都捐给了不同的政客。
目标是仅将每个互联网创始人的独特实例与他们的政治贡献相匹配。我可能需要向匹配算法添加更多数据,而不仅仅是他们的名字(可能包括他们的位置,但这是有问题的,因为许多互联网创始人有多个家庭)
希望对您有所帮助!
截图如下:使用名字和完整姓氏的前三个字母作为匹配条件:
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
在 pkg:RecordLinkage 的 ?phonetics 帮助页面中还描述了一个 Soundex 函数 (soundex
),这可能有助于拼写模糊相似的名称,例如。凯瑟琳和凯茜,或者约翰和乔恩。我没有任何缩短 Soundex 键的经验,但可能有机会在这项工作的基础上再接再厉。
[更新如下]
我想根据通用名称将大型数据集 (112 megs) 与较小的数据集 (<1mg) 合并。两个数据集之间的名称不完全匹配。有许多关于 Whosebug 的教程用于部分匹配或管理大型数据集,但不是两者都适用。当部分匹配的标准方法应用于非常大的数据集时,R 趋于冻结。下面是一些可复制的数据。
在大型数据集中,姓名全部大写,姓在前,偶尔带有后缀(即)
JUDE, RICHARD J. MR.
在较小的数据集中,它们采用标准 "First Name Last Name" 格式,没有逗号或后缀。每个名字都有相关的变量,例如他们给政治候选人多少钱,或者他们在哪家公司工作。
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有几千行。我尝试过 grepl、pmatch 和另一个教程中的专门算法 (here),但是当我尝试这些时 R 挂起。为了提高速度,我已经用 data.table 加载了 X 框架。
如果有帮助的话,我宁愿向合并的数据框中添加许多行。如果有什么我可以做的让这个问题更容易回答,请在评论中告诉我。谢谢你的帮助
[更新]
多亏了评论者,我才能够将匹配的数量减少到大约 20,000,但这仍然远远不够。我在这两个文件中包含了 link。这两个文件是 1)。 U.S 中的每个人。谁在 2012 年进行了政治捐赠和 2)。每个互联网创始人的名字。
https://www.dropbox.com/sh/x6tk1pujvfn0fnb/AACQyuICbJPR7VdDf3bbdIwwa?dl=0
当我应用@BondedDust 的代码时,它明显缩小了!但仍有数十个重名。因此,例如,如果 "Aaron" 创立了一家公司,将添加名为 "Aaron" 的每个人,并且新文件假定 100 人创立了同一家公司,并且每个 "Aaron" 都捐给了不同的政客。
目标是仅将每个互联网创始人的独特实例与他们的政治贡献相匹配。我可能需要向匹配算法添加更多数据,而不仅仅是他们的名字(可能包括他们的位置,但这是有问题的,因为许多互联网创始人有多个家庭)
希望对您有所帮助!
截图如下:使用名字和完整姓氏的前三个字母作为匹配条件:
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
在 pkg:RecordLinkage 的 ?phonetics 帮助页面中还描述了一个 Soundex 函数 (soundex
),这可能有助于拼写模糊相似的名称,例如。凯瑟琳和凯茜,或者约翰和乔恩。我没有任何缩短 Soundex 键的经验,但可能有机会在这项工作的基础上再接再厉。