将街道地址变成组件
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})")
但是,这做出了以下假设:
- 州名缩写长度为2个字符
- 州缩写后紧跟 space
- 邮政编码紧跟在州
之后的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"
我有从 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})")
但是,这做出了以下假设:
- 州名缩写长度为2个字符
- 州缩写后紧跟 space
- 邮政编码紧跟在州 之后的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"