地址部分标准化

问题描述 投票:0回答:1

我在 R 中有一个大型数据帧,其中一列中包含数百万个唯一地址(例如 725 E 8TH ST)。

为了标准化地址,我想将所有短街道后缀缩写替换为其长形式(将 E 更改为 East,将 ST 更改为 Street)。

我不想验证地址。

我发现了一个名为

campfin
的包,其中包含许多预定义的缩写及其长形式(请参阅
usps_street
)。

我尝试使用

normal_address
expand_abbrev
函数来执行此操作,但没有成功。具体来说,我尝试了
normal_address(df$Address, abbs = usps_street)
expand_abbrev(df$Address, abb = usps_street)
。但是,这些不会取代缩写,并且“地址”列保持不变。

有人知道如何正确使用这些功能吗?或者有什么建议可以更换这些东西吗?我不想定义简短形式(如 abb = c("ST" = "STREET") ),因为它们太多了。因此,我认为

usps_street
会有用。

这是我正在查看的一些地址的片段:

structure(list(Address = c("2771 NORTH THOMPSON RD NE", "10 BROOKWAY COURT", 
"1000 WESTCLIFF AVE", "10009 NORTHEAST 145TH ST", "10021 PINECREST DRIVE", 
"1003 WEST VICTORIA STREET"), Unit = c(NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_), 
    City = c("ATLANTA", "MANSFIELD", "SAGINAW", "JONES", "PROVIDENCE VILLAGE", 
    "BRADY"), Country = c(NA, "US", "US", "US", "US", "US"), 
    Zip = c(30319, 76063, 76179, 73049, 76227, 76825), State = c("GA", 
    "TX", "TX", "OK", "TX", "TX")), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))
r street-address
1个回答
0
投票

看起来您正在尝试执行创建

usps_street
数据框的逆操作。例如,查看
"ST"
的缩写:

library(dplyr)
library(campfin)
filter(usps_street, abb == "ST")

# # A tibble: 3 × 2
#   full   abb  
#   <chr>  <chr>
# 1 STR    ST   
# 2 STREET ST   
# 3 STRT   ST 

如果您想通过将 STR、STREET 和 STRT 转换为 ST 来进行标准化,这很简单。但是,您想走另一条路,这意味着您必须在

full
中选择要使用的值。

我假设您想要最长的值,因此在本例中为 STREET。我们需要创建一个数据框,其中 ST、STR 和 STRT 映射到 STREET:

abbs <- usps_street |>
    mutate(
        num_char = nchar(full)
    ) |>
    group_by(abb) |>
    mutate(
        abb = if_else(num_char == max(num_char), abb, full),
        # take the first longest if it's a tie
        full = full[ num_char == max(num_char)][1]
    )

对于街道来说,这看起来像:

abbs  |>
    filter(full == "STREET")

  full   abb   num_char
  <chr>  <chr>    <int>
1 STREET STR          3
2 STREET ST           6
3 STREET STRT         4

然后您可以使用

campfin::expand_abbrev()
功能:

dat  |>
    mutate(
        address_expanded = expand_abbrev(Address, abb = setNames(abbs$full, abbs$abb))
    )

# A tibble: 6 × 7
  Address                   Unit  City               Country   Zip State address_expanded                  
  <chr>                     <chr> <chr>              <chr>   <dbl> <chr> <chr>                             
1 2771 NORTH THOMPSON RD NE NA    ATLANTA            NA      30319 GA    2771 NORTH THOMPSON ROAD NORTHEAST
2 10 BROOKWAY COURT         NA    MANSFIELD          US      76063 TX    10 BROOKWAY COURT                 
3 1000 WESTCLIFF AVE        NA    SAGINAW            US      76179 TX    1000 WESTCLIFF AVENUE             
4 10009 NORTHEAST 145TH ST  NA    JONES              US      73049 OK    10009 NORTHEAST 145TH STREET      
5 10021 PINECREST DRIVE     NA    PROVIDENCE VILLAGE US      76227 TX    10021 PINECREST DRIVE             
6 1003 WEST VICTORIA STREET NA    BRADY              US      76825 TX    1003 WEST VICTORIA STREET   
© www.soinside.com 2019 - 2024. All rights reserved.