R 中是否有一种方法可以根据第 1 列中的字符串是否包含在第 2 列中的字符串中来连接两列?

问题描述 投票:0回答:1

我试图在不使用“模糊匹配”的情况下将几个杂乱的数据集连接在一起。

在核心数据集中(下面的示例数据集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”的过滤,但我还没有取得任何进展。

r left-join contains string-matching
1个回答
1
投票

您可以使用

regex_join()
,来自 包:

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")
© www.soinside.com 2019 - 2024. All rights reserved.