【问题标题】:How to fuzzy lookup a string in one column to another column ignoring sub-setted words如何模糊查找一列中的字符串到另一列忽略子集词
【发布时间】:2023-01-19 20:29:47
【问题描述】:

我有以下 2 个数据帧 vendor_listfirm_list

MARKET_ID <- c(1,2,3,4,5)
MARKET_NAME <- c("DELHI","MUMBAI","BANGALORE","KOLKATA","CHENNAI")
vendor_list <- data.frame(MARKET_ID,MARKET_NAME)
MARKET_NAME <- c("DELHI MUNICIPAL CORP","DELHI","MUMBAI","BENGALURU","BANGALORES","CITYKOLKATA")
POPULATION <- c(1000,2000,3000,4000,5000,6000)
firm_list <- data.frame(MARKET_NAME,POPULATION)

我需要在 firm_list 数据框中的 MARKET_NAME 列中的 vendor_list 数据框中的 MARKET_NAME 列中搜索字符串。但是有一定的条件:

如果字符串作为独立块存在,它应该只显示为匹配项,即它不应该是单词的子集。

所以,

  1. DELHI 与 DELHI MUNICIPAL CORP 的比赛是TRUE
  2. DELHI对DELHI的匹配是TRUE
  3. BANGALORE 与 BANGALORES 的匹配是FALSE,因为 BANGALORE 是 BANGALORES 的子集
  4. KOLKATA 与 CITYKOLKATA 的匹配是FALSE,因为 KOLKATA 是 CITYKOLKATA 的子集

    因此,查找后的最终数据帧final_market_info 应如下所示:

    | MARKET_ID| MARKET_NAME.x |  MARKET_NAME.y      | POPULATION |
    |    1     |     DELHI     | DELHI MUNICIPAL CORP| 1000       |
    |    1     |     DELHI     |   DELHI             | 2000       |
    |    2     |     MUMBAI    |   MUMBAI            | 3000       |
    

    我曾尝试使用 lcs 和 jw 方法在 stringr 包中加入 stringdist_join,但它没有给我这样的正确结果。

【问题讨论】:

  • Market_namevendor_list中只有4个元素(应该有5个)
  • @ChrisRuehlemann 谢谢,已编辑。

标签: r stringr


【解决方案1】:

这是你需要的吗?

firm_list %>%
  mutate(match = str_extract(MARKET_NAME, str_c("\b", vendor_list$MARKET_NAME, collapse = "|", "\b"))) %>%
  left_join(., vendor_list %>% rename(match = MARKET_NAME), by = "match")
           MARKET_NAME POPULATION  match MARKET_ID
1 DELHI MUNICIPAL CORP       1000  DELHI         1
2                DELHI       2000  DELHI         1
3               MUMBAI       3000 MUMBAI         2
4            BENGALURU       4000   <NA>        NA
5           BANGALORES       5000   <NA>        NA
6          CITYKOLKATA       6000   <NA>        NA

这里的要点是vendor_list$MARKET_NAME中的元素被包装到单词\boundary标记中以获得精确匹配并连接为交替模式。

要删除没有匹配项的行,请使用 inner_join 而不是 left_join

firm_list %>%
   mutate(match = str_extract(MARKET_NAME, str_c("\b", vendor_list$MARKET_NAME, collapse = "|", "\b"))) %>%
   inner_join(., vendor_list %>% rename(match = MARKET_NAME), by = "match")
           MARKET_NAME POPULATION  match MARKET_ID
1 DELHI MUNICIPAL CORP       1000  DELHI         1
2                DELHI       2000  DELHI         1
3               MUMBAI       3000 MUMBAI         2

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 2018-12-02
    • 1970-01-01
    • 2017-04-27
    • 2021-09-26
    • 2015-03-09
    • 2020-05-07
    • 2021-01-22
    相关资源
    最近更新 更多