从地址

时间:2016-12-30 09:54:05

标签: r regex gis

我正在寻找地址和邮政编码中的美国邮政编码。记录未标准化并包含数据输入错误。普通邮政编码是5位数字。我也在邮政编码字段中查找4位数字,因为前导0可能因无意中转换为数字而被删除。 5位数的邮政编码后面可以跟一个连字符和4位数字,我也想捕捉它。我希望邮政编码字段中只有一个邮政编码,但是可能在地址字段中可能有几个,因为有些人只在一个表单中键入两个地址。我想在邮政编码中找不到地址中的邮政编码,因为地址中的5位数街道号会产生太多的误报。如果当地邮政编码符合美国格式,我知道美国以外的地址会产生误报。

我想要的结果是一个新的zip_code列,其中包含由" /"分隔的唯一找到的zipcodes字符串; (如果是多个),前导0添加到4位数的邮政编码,如果没有找到,则为空字符串。

这是我的尝试,完全不起作用:

pc <- offices$postal_code[offices$postal_code != ""]
offices$zip_code[offices$postal_code != ""] <- unlist(lapply(pc, function(x) {
  pczc <- sub("(?<!\\d)(\\d{5}\\-\\d{4}|\\d{4,5})(?!\\d)", "\\2", x, perl = T)
  pczc <- ifelse(nchar(pczc) == 4, paste0("0", pczc), pczc)
  return(pczc)
  }))

ad <- offices$address[offices$zip_code == ""]
adzc <- regmatches(ad, gregexpr("(?<!\\d)(\\d{5}\\-\\d{4}|\\d{5})(?!\\d)", ad, perl = T))
offices$zip_code[offices$zip_code != ""] <- paste(unique(adzc), collapse = "/")

我的正则表达式不起作用。此外,可能有更快的方法(我有很多地址)。我首先考虑合并这两个字段,但是这种方法的问题是地址字段中的4位数街道号码会与缺少前导0的zipcodes混淆,后者只能出现在邮政编码字段中。 (还有5位数的街道号码,但我想这无法帮助。)

这是df办公室的样本(不包括所有可能的用例,例如,这两个字段可能都是空的):

structure(list(address = c("Headquarters 2355 E. Camelback Road Suite 300 Phoenix", 
"Headquarters 1401 Constitution Ave NW  Washington", "Headquarters 80 State Street 7th Floor  Albany", 
"Headquarters Spray Gaarde 46  Nieuwegein", "HQ 1055 Washington Blvd., 7th Floor  Stamford", 
"Headquarters Village Khubavali, PO Paud Taluka Mulshi  Pune", 
"Headquarters 231 Lagrange Street  Boston", "Headquarters 401 Chestnut St Suite 410 Chattanooga", 
"Israel Office st. ha Rav Bar Shaul 6  Rehovot", "Headquarters 7721 New Market Street  Olympia", 
"HQ Bernrieder Str. 15  Niederwinkling", "Headquarters 2810 Sydney Road  Plant City", 
"Headquarters 1350 Avenue of the Americas 9th Floor New York", 
"Headquarters Askanischer Platz 3  Berlin", "Australian Head Office Level 2, 145 Flinders Lane  Melbourne", 
"HQ 13303 Washington Avenue  Racine", "HQ 9150 E. Del Camino Dr., Ste 112  Scottsdale", 
"Arcadia Corporate Merchandise Ltd - Promotional Giveaways Grove Place, Wellington Road  High Wycombe", 
"Israel Office Shorashim, D.N.Misgav  ", "HQ 6009 Penn Avenue S.  Minneapolis"
), postal_code = c("85016", "20230", "12207", "3436", "6901", 
"412 108", "2132", "37402", "7625149", "98501", "94559", "33566-1173", 
"10019", "10963", "3000", "53406", "85258", "HP12 3PR", "20164", 
"55419")), .Names = c("address", "postal_code"), row.names = c(1L, 
2L, 4L, 5L, 6L, 8L, 10L, 11L, 12L, 14L, 15L, 18L, 19L, 21L, 22L, 
23L, 24L, 25L, 27L, 28L), class = "data.frame")

2 个答案:

答案 0 :(得分:1)

您可以使用regex而不是执行一些复杂的googlemapsapi。我确信有一个R包,但以下代码应该有所帮助。

library(tidyr)
library(magrittr)
library(dplyr)
library(rvest)
library(jsonlite)
library(data.table)


getInfo <- function(data, address){

    mURL <- "http://maps.googleapis.com/maps/api/geocode/json?address=" %>% 
      paste0(unlist(data[address])) %>% gsub("Headquarters|HQ", "", .) %>% sapply(URLencode)

    temp <- lapply(mURL, function(y) {
                info <- read_html(y) %>% html_text %>% fromJSON(simplifyDataFrame = TRUE)
                if(length(info$results)){
                    info <- info[[1]]$address_components[[1]] %>% as.data.frame %>% select(-short_name)
                    info$types <- sapply(info$types, function(x) x[1])
                    info %<>% group_by(types) %>% summarize(long_name=toString(long_name)) %>% 
                             select(long_name, types) %>% ungroup
                    info %<>% spread(types, long_name)
                } else {
                  info <- data.frame(administrative_area_level_1=NA, administrative_area_level_2=NA, 
                                     country=NA, locality=NA, neighborhood=NA, postal_code=NA, 
                                     route=NA, street_number=NA, subpremise=NA)
                }
                info
      }) %>% rbindlist(fill=TRUE)

cbind(data, temp)

}

df2 <- getInfo(df, "address")

在我假设名为data.frame的{​​{1}}的一小部分上进行测试。 您可以在googlemapsapi

上阅读更多内容
df

enter image description here

答案 1 :(得分:1)

以下内容清理Thread.currentThread() == mAllowedThread;列,但您没有在地址字段中提供带有拉链的数据框切片,因此不知道该列中的“真实世界”数据是什么样的潜在的时间下沉没有功效。一旦为您的问题提供更具代表性的数据,我就可以从地址字段中添加拉链提取。

postal_code