我在 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"))
看起来您正在尝试执行创建
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