如何从 R 数据框中杂乱且不统一的部分地址列中解析出城市和国家信息?

问题描述 投票:0回答:1

我有一个非常大的数据,其中包含非常混乱且不统一的地址字段。我只想从中提取一个国家名称。大多数记录包含国家/地区和城市,有些记录包含其他信息,例如街道地址、州或省。因为有太多重叠(街道可以以国家、城市或州命名),我正在考虑使用

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
也往往非常慢并且使用大量资源。任何有关如何减少误报匹配和提高性能的建议都会受到欢迎。谢谢。

r stringr fuzzyjoin
1个回答
0
投票

鉴于您更新的示例数据,似乎您仍然可以从每个部分地址中获取最后一个单词来回答这个问题。

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() 之类的东西)。

© www.soinside.com 2019 - 2024. All rights reserved.