如何通过检测可能的多个子字符串来匹配查找 table,如将 "US|USA|United States" 与 R 中的 `abc,United States,xyz` 匹配?

How to match a lookup table by detecing possibly multiple substrings as in matching "US|USA|United States" with `abc,United States,xzy` in R?

我不太确定问题标题中的术语,但我有一个包含 non-structured 个机构地址的数据框,我想通过查找 table 来提取他们的国家/地区可能的匹配项。

地址可能如下所示:

address
xxx US
xxx USA yy
xxx United States yy
xxx UK
xxx United Kingdom yy

请注意,国家/地区不一定位于字符串的末尾。

管道将匹配并提取任何可能的国家名称(来自大约 20 个国家的列表)和 return 每个国家的 clean 国家名称.

(df <- tribble(
    ~address,                 ~clean_country,
    "xxx US",                 "United States",
    "xxx, USA yy",            "United States",
    "xxx United States, yy",  "United States",
    "xxx UK",                 "United Kingdom",
    "xxx United Kingdom yy",  "United Kingdom",
    "xxx zz yy",              NA_character_,
))

我正在考虑将查找 table 创建为包含两列的 data.frame:

(lookup <- tribble(
    ~country,          ~matches,
    "United States",   "US|USA|United States",
    "United Kingdom",  "UK|United Kingdom"
))

然后用 regex 检查是否可以在 df$address 列,然后将 country 列附加为 df.

中的 clean_country

当然,我对遵循其他策略的解决方案很感兴趣。越(内存)效率越高,因为数据集比较大。

使用查找 table 方法,您可以使用 str_extractaddress 中提取国家/地区名称,并在查找 table.[=13] 中将其替换为国家/地区名称=]

library(stringr)
str_replace_all(str_extract(df$address, str_c(lookup$matches, collapse = '|')), 
                setNames(lookup$country, lookup$matches))

#[1] "United States"  "United States"  "United States" 
#[4] "United Kingdom" "United Kingdom" NA