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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:00:57