我需要连接两个数据集,其中唯一的标识符是公司名称.例如:

db1 <- tibble(
  Company = c('Bombardier Inc.','Honeywell Development Corp','The Pepsi Bottling Group (Canada), Ulc (“Pbgc”)','PepsiCo Canada ULC'),
  var1 = 1:4
)

db2 <- tibble(
  Name = c('Bombardier Inc.','Honeywell Dev Corp','The Pepsi Bottling Group (Canada), ULC','PepsiCo Canada ULC (“Pcu”)'),
  var2 = 6:9
)

显然,一个简单的dplyr::left_join()是行不通的.我try 了以下方法,但没有成功:

fuzzyjoin::regex_left_join(db1,db2,by=c('Company'='Name'))
# A tibble: 4 x 4
  Company                                          var1 Name             var2
  <chr>                                           <int> <chr>           <int>
1 Bombardier Inc.                                     1 Bombardier Inc.     6
2 Honeywell Development Corp                          2 NA                 NA
3 The Pepsi Bottling Group (Canada), Ulc (“Pbgc”)     3 NA                 NA
4 PepsiCo Canada ULC                                  4 NA                 NA

我通过删除名字中的"非必要"字符取得了一些进展:

db1 <- db1 %>% mutate(Company.alt = str_remove_all(Company,regex(
  'The|Canada|Inc|Ltd|Company|\\bCo\\b|Corporation|Corp|Group|ULC|[:punct:]',
  ignore_case = T
)) %>% str_squish())

db2 <- db2 %>% mutate(Name.alt = str_remove_all(Name,regex(
  'The|Canada|Inc|Ltd|Company|\\bCo\\b|Corporation|Corp|Group|ULC|[:punct:]',
  ignore_case = T
)) %>% str_squish())

fuzzyjoin::regex_left_join(db1,db2,by=c('Company.alt'='Name.alt'))
# A tibble: 4 x 6
  Company                                          var1 Company.alt           Name            var2 Name.alt 
  <chr>                                           <int> <chr>                 <chr>          <int> <chr>    
1 Bombardier Inc.                                     1 Bombardier            Bombardier In~     6 Bombardi~
2 Honeywell Development Corp                          2 Honeywell Development Honeywell Dev~     7 Honeywel~
3 The Pepsi Bottling Group (Canada), Ulc (“Pbgc”)     3 Pepsi Bottling Pbgc   The Pepsi Bot~     8 Pepsi Bo~
4 PepsiCo Canada ULC                                  4 PepsiCo               NA                NA NA      

但这仍然让最后一行无法匹配.为了更清楚,Company.alt的最后一行是PepsiCo,这与Name.alt的最后一行PepsiCo Pcu并不模糊匹配.

有没有办法成功地左键连接这两个数据集?

推荐答案

1) phonics语音软件包有许多近似匹配的方法,例如soundex.有关其他方法,请参阅软件包文档.

library(dplyr)
library(phonics)

db1s <- mutate(db1, s = soundex(Company, clean = FALSE))
db2s <- mutate(db2, s = soundex(Name, clean = FALSE))
left_join(db1s, db2s)

给:

Joining, by = "s"
# A tibble: 4 x 5
  Company                                          var1 s     Name          var2
  <chr>                                           <int> <chr> <chr>        <int>
1 Bombardier Inc.                                     1 B516  Bombardier ~     6
2 Honeywell Development Corp                          2 H543  Honeywell D~     7
3 The Pepsi Bottling Group (Canada), Ulc (“Pbgc”)     3 T112  The Pepsi B~     8
4 PepsiCo Canada ULC                                  4 P122  PepsiCo Can~     9

2) SQLite SQLite具有内置的soundex功能.

library(sqldf)

sqldf("select *
  from db1
  left join db2 on soundex(Company) = soundex(Name)")

给:

                                          Company var1                                   Name var2
1                                 Bombardier Inc.    1                        Bombardier Inc.    6
2                      Honeywell Development Corp    2                     Honeywell Dev Corp    7
3 The Pepsi Bottling Group (Canada), Ulc (“Pbgc”)    3 The Pepsi Bottling Group (Canada), ULC    8
4                              PepsiCo Canada ULC    4             PepsiCo Canada ULC (“Pcu”)    9

R相关问答推荐

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

使用ggplot将平滑线添加到条形图

R创建一个数据透视表,计算多个组的百分比

如何使用R Shiny中的条件面板仅隐藏和显示用户输入,同时仍允许运行基础计算?

名称输出pmap on tible

如何使用R对每组变量进行随机化?

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

在for循环中转换rabrame

从所有项的 struct 相同的两级列表中,将该第二级中的所有同名项绑定在一起

以字符格式导入的ExcelElectron 表格日期列标题

如何平滑或忽略R中变量的微小变化?

在R中,如何从一系列具有索引名的变量快速创建数据帧?

如何将这个小列表转换为数据帧?

按组使用dummy r获取高于标准的行的平均值

如何使用grepl()在数据帧列表中 Select 特定字符串?

在不重复主题的情况下重新排列组

禁用时,SelecizeInput将变得不透明

R没有按顺序显示我的有序系数?

向数据添加标签

即使使用相同的种子,mtry值也取决于TuneGrid范围