如何使用str_extract提取地址信息且模式不匹配时不丢失数据?
解决地址格式化中保留原有列内容的问题
你遇到的核心问题是直接用str_extract的结果覆盖了add2列,导致原本已经正确的内容被NA替换了。我们需要调整逻辑,只对那些add1中包含目标模式(Apt/Unit + 数字)的行进行提取和更新,同时保留add2原有的内容。
步骤说明
- 先从
add1中提取公寓/单元号模式,存为临时列,避免直接覆盖add2。 - 仅当提取到有效内容时,更新
add2;否则保留add2原有的值。 - 把
add1中提取出来的公寓/单元号部分移除,让add1只保留街道地址。 - 清理地址中可能残留的多余空格。
完整代码示例
library(dplyr) library(stringr) # 你的原始数据(还原真实场景:部分行的add1包含公寓号,add2为空) data <- tibble( name = c("John Doe", "Jane Doe", "Jerry Day", "Tom May"), add1 = c("123 Main St", "2 S Main Apt 5", "77 N Main Unit 1", "11 E Main"), add2 = c("Apt 2", "", "", "PO Box 7") ) # 处理地址格式化 data_cleaned <- data %>% # 提取add1中的Apt/Unit模式,支持任意位数的数字 mutate(apt_extract = str_extract(add1, "Apt \\d+|Unit \\d+")) %>% # 更新add2:如果提取到内容就用提取值,否则保留原add2 mutate(add2 = if_else(!is.na(apt_extract), apt_extract, add2)) %>% # 从add1中移除提取到的公寓号部分 mutate(add1 = str_remove(add1, "Apt \\d+|Unit \\d+")) %>% # 去除地址前后的多余空格 mutate(add1 = str_trim(add1)) %>% # 删除临时列 select(-apt_extract) # 查看结果 print(data_cleaned)
运行结果
# A tibble: 4 × 3 name add1 add2 <chr> <chr> <chr> 1 John Doe 123 Main St Apt 2 2 Jane Doe 2 S Main Apt 5 3 Jerry Day 77 N Main Unit 1 4 Tom May 11 E Main PO Box 7
关键优化点
- 把模式从
"Apt [0-9]{1}|Unit [0-9]{1}"改成"Apt \\d+|Unit \\d+",可以匹配任意位数的公寓号(比如Apt 10、Unit 234),适用性更强。 - 使用
if_else来保留原add2的内容,避免被NA覆盖。 - 用
str_trim清理地址中可能残留的空格,保证格式整洁。
内容的提问来源于stack exchange,提问作者SGarg
相关产品推荐
相关产品推荐

