我有一个非常大的数据,其中包含非常混乱且不统一的地址字段。我只想从中提取一个国家名称。大多数记录包含国家/地区和城市,有些记录包含其他信息,例如街道地址、州或省。因为有太多重叠(街道可以以国家、城市或州命名),我正在考虑使用
R
maps
库与 fuzzyjoin
一起搜索国家和城市。这是我尝试过的简短示例:
library(dplyr)
library(stringr)
library(maps)
library(fuzzyjoin)
partial_address <-
c("London 121280 Ontario Canada",
"Milano, Italy",
"123 First St Columbus OH USA",
"Cali-Valle del Cauca Colombia",
"98765 France Paris",
"Zurich Zurich Switzerland",
"Mexico City Mexico",
"Nagoya 123456 Japan",
"BEIJING BEIJING CHINA",
"Thailand 12345 Bangkok")
df <-
data.frame(partial_address) %>%
mutate(partial_address = toupper(partial_address))
data(world.cities)
world_cities <-
distinct(world.cities,
name,
country.etc) %>%
mutate(name = toupper(name),
country.etc = toupper(country.etc))
df_new <-
fuzzy_left_join(df,
world_cities,
by = c("partial_address" = "name",
"partial_address" = "country.etc"),
match_fun = str_detect)
我的输出如下所示:
> df_new
partial_address name country.etc
1 LONDON 121280 ONTARIO CANADA LONDON CANADA
2 MILANO, ITALY MILAN ITALY
3 123 FIRST ST COLUMBUS OH USA COLUMBUS USA
4 CALI-VALLE DEL CAUCA COLOMBIA CALI COLOMBIA
5 CALI-VALLE DEL CAUCA COLOMBIA COLOMBIA COLOMBIA
6 98765 FRANCE PARIS PARIS FRANCE
7 ZURICH ZURICH SWITZERLAND ZURICH SWITZERLAND
8 MEXICO CITY MEXICO MEXICO CITY MEXICO
9 MEXICO CITY MEXICO XICO MEXICO
10 NAGOYA 123456 JAPAN AGO JAPAN
11 NAGOYA 123456 JAPAN NAGO JAPAN
12 NAGOYA 123456 JAPAN NAGOYA JAPAN
13 BEIJING BEIJING CHINA BEIJING CHINA
14 THAILAND 12345 BANGKOK BANGKOK THAILAND
如您所见,这并不完全是我想要的,因为显然墨西哥有一个名为“Xico”的城市,哥伦比亚有一个名为“Colombia”的城市,等等。
fuzzy_join
也往往非常慢并且使用大量资源。任何有关如何减少误报匹配和提高性能的建议都会受到欢迎。谢谢。
鉴于您更新的示例数据,似乎您仍然可以从每个部分地址中获取最后一个单词来回答这个问题。
library(tidyverse)
partial_address <-
c("London 121280 Ontario Canada",
"Milano, Italy",
"123 First St Columbus OH USA",
"Cali-Valle del Cauca Colombia",
"98765 France Paris",
"Zurich Zurich Switzerland",
"Mexico City Mexico",
"Nagoya 123456 Japan",
"BEIJING BEIJING CHINA",
"Thailand 12345 Bangkok")
df <-
data.frame(partial_address) %>%
mutate(partial_address = toupper(partial_address))
df2 <- df %>%
mutate(country = str_extract(partial_address, "\\b(\\w+)$"))
其中为您提供示例数据的每个部分地址的国家/地区:
部分地址 | 国家 |
---|---|
伦敦 121280 加拿大安大略省 | 加拿大 |
意大利米兰 | 意大利 |
123 第一街哥伦布俄亥俄州美国 | 美国 |
哥伦比亚卡利山谷德尔考卡 | 哥伦比亚 |
98765 法国巴黎 | 巴黎 |
苏黎世 瑞士苏黎世 | 瑞士 |
墨西哥墨西哥城 | 墨西哥 |
日本名古屋 123456 | 日本 |
北京 中国北京 | 中国 |
泰国 12345 曼谷 | 曼谷 |
可能仍然会出现错误情况,但这也许是一个值得探索的替代方案。
这是一种粗略的方法,当一个国家由多个单词组成时,它会失败,但这种情况的数量有限,然后您可以在数据中替换它们(使用 gsub() 之类的东西)。