如何通过检测可能的多个子字符串来匹配查找 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_extract
从 address
中提取国家/地区名称,并在查找 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
我不太确定问题标题中的术语,但我有一个包含 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_extract
从 address
中提取国家/地区名称,并在查找 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