【发布时间】:2016-12-30 09:54:04
【问题描述】:
我在地址和邮政编码的 df 中查找美国邮政编码。这些记录是非规范化的并且包含数据输入错误。普通邮政编码是 5 位数字。我还在邮政编码字段中寻找 4 位数字,因为前导 0 可能已因无意转换为数值而被丢弃。 5 位邮政编码后面可以跟一个连字符和 4 位数字,我也想捕获它们。我希望邮政编码字段中只有一个邮政编码,但地址字段中可能有多个邮政编码,因为有些人以一个仅用于一个的形式键入两个地址。我只想在邮政编码中找不到邮政编码时才在地址中查找邮政编码,因为地址中的 5 位街道号码会产生太多误报。我意识到如果当地邮政编码与美国格式匹配,美国以外的地址会产生误报。
我想要的结果是一个新的 zip_code 列,其中包含由“/”(如果有多个)分隔的唯一找到的邮政编码字符串,前导 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 的邮政编码混淆,后者只能出现在邮政编码字段中。 (也有 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")
【问题讨论】:
-
您能根据示例显示预期的输出吗?
-
基于此数据框的预期结果是什么?因此,您的解释可以简化(提供预期的结果也会有很大帮助!)。