【发布时间】:2020-11-21 15:53:09
【问题描述】:
我正在尝试内部连接两个数据集:df1 of 50,000 obs 看起来像这样:
Name | Line.1 | Line.2 | Town | County | Postcode
-------------------|------------------|------------|------------|--------------|----------
ACME Inc | 63 Long Street | | Fakeington | Lincolnshire | PA4 8QU
BETA LTD | 91a | Main Drove | Cloud City | Something | BN1 6LD
The Giga | 344 Lorem Street | | Ipsom | Dolor | G2 8LY
df2 的 500,000 个 obs 看起来像这样:
Name | AddressLine1 | AddressLine2 | AddressLine3 | AddressLine4 | Postcode | RatingValue
-------------------|----------------|------------------|--------------|--------------|----------|-------------
ACME | | 63 Long Street | Fakeington | Lincolnshire | PA4 8QU | 1
Random Company | | Rose Ave | Fakeington | | AB2 51GL | 5
BETA Limited | Business House | 91a Main Drove | Something | | BN1 6LD | 3
Giga Incorporated | | 344 Lorem Street | Ipsum | Dolor | G2 8LY | 5
我想得到类似df_final 的东西。
Name | Postcode | RatingValue
-------------------|----------|-------------
ACME Inc | PA4 8QU | 1
BETA LTD | BN1 6LD | 3
Giga Incorporated | G2 8LY | 5
这些是一对一的匹配,df1 中的所有值都应该存在于df2 中。 Postcode 是完全匹配,而地址被分成多行,没有常规模式,所以我认为我最好的选择是匹配 Name。
我尝试了fuzzyjoin 包,但我得到了Error: cannot allocate vector of size 120.6 Gb,所以我想我必须使用另一种适用于更大数据集的方法。
您对解决此问题的最佳方法有什么想法吗?
df1 <- data.frame(
stringsAsFactors = FALSE,
Name = c("ACME Inc", "BETA LTD", "Giga Incorporated"),
Line.1 = c("63 Long Street", "91a", "344 Lorem Street"),
Line.2 = c(NA, "Main Drove", NA),
Town = c("Fakeington", "Cloud City", "Ipsom"),
County = c("Lincolnshire", "Something", "Dolor"),
Postcode = c("PA4 8QU", "BN1 6LD", "G2 8LY")
)
df2 <- data.frame(
stringsAsFactors = FALSE,
Name = c("ACME", "Random Company","BETA Limited","Giga Incorporated"),
AddressLine1 = c(NA, NA, "Business House", NA),
AddressLine2 = c("63 Long Street", "Rose Ave","91a Main Drove","344 Lorem Street"),
AddressLine3 = c("Fakeington", "Fakeington", "Something", "Ipsum"),
AddressLine4 = c("Lincolnshire", NA, NA, "Dolor"),
Postcode = c("PA4 8QU", "AB2 51GL", "BN1 6LD", "G2 8LY"),
RatingValue = c(1L, 5L, 3L, 5L)
)
【问题讨论】:
-
我首先将其分解为一个较小的问题。从两个现有列创建一个数据框:df1$Name 和 df2$Name,其中的行代表基于满足某些匹配阈值(soundex、字符串距离,无论您想要什么)的“匹配”公司名称的每个组合。对 df1 和 df2 进行笛卡尔连接,然后过滤,只保留有效组合。
-
@BillO'Brien 加入笛卡尔?
df1是 50K 行,df2500K,50000*500000是2.5e+10。 -
我的立场是正确的。
标签: r join inner-join fuzzyjoin