我试图在不使用“模糊匹配”的情况下将几个杂乱的数据集连接在一起。
在核心数据集中(下面的示例数据集1),我有简单的公司名称。在我想要加入的数据集中(包含有关这些公司的其他信息),这些名称带有各种后缀、前缀和其他复杂信息。这些后缀、前缀的长度多种多样,使得模糊匹配不太合适。
作为第一步,我想根据数据集 1 中“exporter_group”中的字符串是否包含在数据集 2 中“company”中的字符串来加入,保留数据集 2 中的“company”列,以便我可以手动检查匹配。
这可能吗?我采取的方法正确吗?我想到的另一种方法是创建简单公司名称的映射,并使用 dataset2 中匹配 mutate 的字符串来创建具有目标简单名称的列,然后基于该新列加入..
任何帮助表示赞赏!下面的示例是一家公司,实际上我将拥有数百家公司,因此需要扩展到该规模。
dataset1 <- tibble::tribble(
~exporter_group, ~exporter,
"LOUIS DREYFUS", "LDC INDONESIA",
"LOUIS DREYFUS", "LDC TRADING INDONESIA",
"LOUIS DREYFUS", "LDC EAST INDONESIA",
"LOUIS DREYFUS", "LOUIS DREYFUS"
)
dataset2 <- tibble::tribble(
~company, ~parent_company, ~subsidiares, ~market_cap_usd, ~bloomberg_ticker, ~thomson_reuters_ticker,
"LOUIS DREYFUS COMPANY", NA, NA, NA, "0308213D NA EQUITY", NA
)
我尝试过“模糊匹配”和基于“str_detect”的过滤,但我还没有取得任何进展。
您可以使用
regex_join()
,来自 fuzzyjoin 包:
pacman::p_load(fuzzyjoin)
regex_join(dataset2, dataset1, by = c(company = "exporter_group"))
输出:(注意:您的示例中的 dataset2 有问题,所以我必须自己制作!)
A tibble: 4 × 8
company parent_company subsidiares market_cap_usd bloomberg_ticker
<chr> <chr> <dbl> <dbl> <chr>
1 LOUIS DREYFUS COMP… Amazon 4 1000 GOOG
2 LOUIS DREYFUS COMP… Amazon 4 1000 GOOG
3 LOUIS DREYFUS COMP… Amazon 4 1000 GOOG
4 LOUIS DREYFUS COMP… Amazon 4 1000 GOOG
# ℹ 3 more variables: thomson_reuters_ticker <chr>, exporter_group <chr>,
# exporter <chr>
regex_join()
默认情况下执行内部联接,但您可能希望使用 mode
参数将其更改为完全联接或左联接,或者分别将其更改为 regex_left_join()
或 regex_full_join()
.
数据:
dataset2 <- tibble::tribble(
~company, ~parent_company, ~subsidiares, ~market_cap_usd, ~bloomberg_ticker, ~thomson_reuters_ticker,
"LOUIS DREYFUS COMPANY", "Amazon", 4, 1000, "GOOG", "idk")