R语言中使用campfin包标准化地址后缀缩写失败求助
问题描述
我在R中有一个包含数百万条唯一地址的数据框,地址列示例如“725 E 8TH ST”。为了标准化地址,希望将所有街道后缀缩写替换为全称(如将E替换为East,ST替换为Street),不需要对地址进行验证。发现campfin包中的内置tibble对象usps_street包含大量预定义的缩写与全称对应关系,但尝试使用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"))
解决方案
正确使用campfin包的方法
campfin包的expand_abbrev函数需要的是命名向量格式的缩写映射,而usps_street是tibble格式,需要先转换格式:
- 加载工具包并处理映射关系:
library(campfin) library(dplyr) # 将usps_street转换为命名向量,abbrev作为键,full作为对应值 abb_vec <- setNames(usps_street$full, usps_street$abbrev)
- 调用
expand_abbrev完成替换:
df$Address_clean <- expand_abbrev( string = df$Address, abb = abb_vec, ignore_case = TRUE, # 兼容地址中大小写不一致的情况 whole = TRUE # 确保只匹配完整单词,避免部分匹配(比如RD出现在其他单词中) )
运行后你的测试数据会得到如下标准化结果:
- "2771 NORTH THOMPSON Road Northeast"
- "10 BROOKWAY Court"(COURT已是全称,无变化)
- "1000 WESTCLIFF Avenue"
- "10009 NORTHEAST 145TH Street"
- "10021 PINECREST Drive"(DRIVE已是全称,无变化)
- "1003 WEST VICTORIA Street"(STREET已是全称,无变化)
替代方案:用stringr批量替换
如果campfin的方法不符合需求,也可以用stringr结合usps_street实现批量替换:
library(stringr) # 生成匹配完整单词的正则表达式 patterns <- paste0("\\b", usps_street$abbrev, "\\b") names(patterns) <- usps_street$full # 批量替换地址中的缩写 df$Address_clean <- str_replace_all(df$Address, patterns)
这种方法利用正则精准匹配完整缩写单词,适合大规模数据处理,效率表现稳定。
内容的提问来源于stack exchange,提问作者doing_data
相关产品推荐
相关产品推荐

