如何在R中使用sub函数和正则表达式从街道地址提取子串
解决方法
你当前的sub逻辑是将匹配到的单元号片段替换为空,所以得到的是剔除单元号后的地址剩余部分。要直接提取单元号内容,推荐用你已经加载的stringr包的str_extract()函数,写法更直观:
library(dplyr) library(stringr) CivicAddress <- c("1000 FAKE STREET", "UNIT 1 1000 FAKE STREET", "UNIT 2 1000 FAKE STREET") df2 <- data.frame(CivicAddress, stringsAsFactors = FALSE) df2 <- df2 %>% mutate( # 直接提取单元号片段,无匹配则返回NA UnitNo = str_extract(CivicAddress, "UNIT\\s+\\S+"), # 同时可生成剔除单元号后的标准地址,对应你原来的逻辑 CleanAddress = str_remove(CivicAddress, "\\s*UNIT\\s+\\S+\\s*") )
如果要坚持用base R的sub()实现,用捕获组的写法即可:
df2$UnitNo <- sub("^(.*?)(UNIT\\s+\\S+)?(.*)$", "\\2", df2$CivicAddress) # 把没有匹配到单元号的空字符串转为NA df2$UnitNo[df2$UnitNo == ""] <- NA
运行后输出结果如下:
| CivicAddress | UnitNo | CleanAddress |
|---|---|---|
| 1000 FAKE STREET | NA | 1000 FAKE STREET |
| UNIT 1 1000 FAKE STREET | UNIT 1 | 1000 FAKE STREET |
| UNIT 2 1000 FAKE STREET | UNIT 2 | 1000 FAKE STREET |
如果后续遇到其他单元号格式(例如Unit A、#3等),调整正则的匹配规则即可适配。
内容的提问来源于stack exchange,提问作者VancityPlanner
相关产品推荐
相关产品推荐

