You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用str_extract提取地址信息且模式不匹配时不丢失数据?

解决地址格式化中保留原有列内容的问题

你遇到的核心问题是直接用str_extract的结果覆盖了add2列,导致原本已经正确的内容被NA替换了。我们需要调整逻辑,只对那些add1中包含目标模式(Apt/Unit + 数字)的行进行提取和更新,同时保留add2原有的内容。

步骤说明

  1. 先从add1中提取公寓/单元号模式,存为临时列,避免直接覆盖add2。
  2. 仅当提取到有效内容时,更新add2;否则保留add2原有的值。
  3. 把add1中提取出来的公寓/单元号部分移除,让add1只保留街道地址。
  4. 清理地址中可能残留的多余空格。

完整代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:24:17