将街道地址变成组件

Turn Street Address Into Components

我有从 SQL 中提取的地址数据,现在已加载到 R 中。我正在尝试提取单个组件,即查询末尾的邮政编码(State 也会对人好点)。我希望邮政编码和州位于新的单独列中。

主要问题是 ZIP-CODE 有时是 5 位数字,有时是 9 位数字。

两个示例行是:

Address_FULL
1234 NOWHERE ST WASHINGTON DC 20005
567 EVERYWHERE LN CHARLOTTE NC 22011-1203

我怀疑我需要某种正则表达式 \d{5} 符号,或者 dplyr 中我不知道存在的某种奇特操作。

如果邮政编码总是在末尾,您可以使用

str_extract(Address_FULL,"[[:digit:]]{5}(-[[:digit:]]{4})?$")

要通过 dplyr 添加 "zip" 列,您可以使用

df %>% mutate(zip = str_extract(Address_FULL,"[[:digit:]]{5}(-[[:digit:]]{4})?$"))

其中 df 是包含 Address_FULL 和 str_extract() 来自 stringr.

状态可以提取如下:

str_extract(Address_FULL,"(?<=\s)[[:alpha:]]{2}(?=\s[[:digit:]]{5})")

但是,这做出了以下假设

  1. 州名缩写长度为2个字符
  2. 州缩写后紧跟 space
  3. 邮政编码紧跟在州
  4. 之后的space之后

假设zip总是在最后,你可以试试:

tail(unlist(strsplit(STRING, split=" ")), 1)

例如

ex1 = "1234 NOWHERE ST WASHINGTON DC 20005"
ex2 = "567 EVERYWHERE LN CHARLOTTE NC 22011-1203"

> tail(unlist(strsplit(ex1, split=" ")), 1)
[1] "20005"

> tail(unlist(strsplit(ex2, split=" ")), 1)
[1] "22011-1203"

使用我的包裹tfwstring

自动处理任何地址类型,即使有前缀和后缀。

if (!require(remotes)) install.packages("remotes")
remotes::install_github("nbarsch/tfwstring")
parseaddress("1234 NOWHERE ST WASHINGTON DC 20005", force_stateabb = F)
     AddressNumber         StreetName StreetNamePostType          PlaceName          StateName            ZipCode 
            "1234"          "NOWHERE"               "ST"       "WASHINGTON"               "DC"            "20005" 
parseaddress("567 EVERYWHERE LN CHARLOTTE NC 22011-1203", force_stateabb = F)
     AddressNumber         StreetName StreetNamePostType          PlaceName          StateName            ZipCode 
             "567"       "EVERYWHERE"               "LN"        "CHARLOTTE"               "NC"       "22011-1203"