使用extract拆分地址字符串时如何避免NA并保留有效值?
问题场景
输入数据
street housenumber wallstreet 17-20 NULL wafflestreet 5
原使用代码
extract("street", c("street", "housenumber"), "(\\D+)(\\d.*)")
注:代码存在拼写错误,
housnumber应为housenumber
原输出结果
street housenumber wallstreet 17-20 NA NA
问题
如何避免出现NA值?如何保留“wafflestreet”及其对应的“housenumber”值?
解决方案
1. 修正正则匹配逻辑
原正则(\D+)(\d.*)强制要求字符串必须包含「非数字段+数字段」,但wafflestreet没有数字部分,导致匹配失败返回NA。我们可以把数字段设为可选分组,同时将非数字段改为非贪婪匹配,避免吃掉街道名后的空格:
extract("street", c("new_street", "new_housenumber"), "(\\D+?)(\\d.*)?", remove = FALSE)
这里(\d.*)?表示数字段是可选匹配,\D+?的非贪婪模式能精准截取到数字部分之前的街道名。
2. 合并提取值与原有列值
第二行的housenumber原本就有有效值5,我们需要用coalesce函数将提取得到的字段与原有字段合并——优先取提取后的值,提取失败时沿用原有值:
library(dplyr) library(tidyr) df %>% extract(street, c("ext_street", "ext_housenumber"), "(\\D+?)(\\d.*)?", remove = FALSE) %>% mutate( street = coalesce(ext_street, street), housenumber = coalesce(ext_housenumber, housenumber) ) %>% select(-ext_street, -ext_housenumber)
3. 最终效果
执行后会得到符合预期的结果:
street housenumber wallstreet 17-20 wafflestreet 5
内容的提问来源于stack exchange,提问作者LindorS
相关产品推荐
相关产品推荐

