将街道地址变成组件

时间:2019-03-19 18:12:32

标签: r regex dplyr street-address

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

主要问题是邮政编码有时是5位数字,有时是9位数字。

两个示例行将是:

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

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

3 个答案:

答案 0 :(得分:2)

如果邮政编码始终在结尾,则可以使用

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. 状态缩写后面紧跟一个空格
  3. 邮政编码紧跟在状态后面的空格之后

答案 1 :(得分:1)

假设邮政编码始终在结尾,您可以尝试:

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"

答案 2 :(得分:0)

使用我的包裹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"