如何用R语言将数据集中的地区名称替换为对应编码?
问题:将地址文本中的地区名称替换为对应编码
可复现示例数据
library(tidyverse) adrs_data <- data.frame( adress = c("6 Frien Street, Paris", "Toulouse, 7 Hospital street", "10 market avenue (Bordeaux)") ) dep_code <- data.frame( code = c("75", "31", "33"), names = c("Paris", "Toulouse", "Bordeaux") )
原代码的问题
你写的代码存在两个关键问题:
case_when(adress %in% d_search)逻辑错误:d_search是用|拼接的正则匹配串,而adress是完整的地址文本,不可能直接属于这个正则串组成的集合,导致所有行都会走TRUE ~ adress分支,根本没执行替换。str_replace_all(adress, d_search, c_search)无法实现对应替换:str_replace_all的替换参数如果是向量,会循环替换所有匹配项,但这里需要的是把"Paris"换成"75"、"Toulouse"换成"31"这种一一对应的映射,直接传两个向量达不到预期效果。
正确解决方案
可以通过创建命名替换向量的方式实现精准对应替换,同时用正则匹配确保只替换完整的地区名称(避免部分匹配):
方法1:使用命名向量结合str_replace_all
# 创建命名向量:地区名称作为名称,编码作为值 replace_map <- set_names(dep_code$code, dep_code$names) # 执行替换,用\\b确保匹配完整单词(避免类似"Parisian"被误替换) df <- adrs_data %>% mutate(c_adress = str_replace_all(adress, regex(paste0("\\b", names(replace_map), "\\b", collapse = "|")), replace_map))
方法2:逐行匹配替换(适合更复杂的匹配场景)
如果需要更精细的控制,可以用reduce2结合逐行处理:
df <- adrs_data %>% rowwise() %>% mutate( c_adress = reduce2(dep_code$names, dep_code$code, ~str_replace(.x, .y, ..3), .init = adress) ) %>% ungroup()
预期输出
运行上述代码后,得到的结果符合预期:
# 输出结果 # adress c_adress # 1 6 Frien Street, Paris 6 Frien Street, 75 # 2 Toulouse, 7 Hospital street 31, 7 Hospital street # 3 10 market avenue (Bordeaux) 10 market avenue (33)
内容的提问来源于stack exchange,提问作者Coralie
相关产品推荐
相关产品推荐

