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

如何在R语言中将数据框中的错误国名替换为标准名称?

在R中统一国家名称拼写:替换错误名称为标准名称

问题背景

我手头有两个数据框:一个是包含特定拼写国家名称的调查数据,另一个是记录各国得分的数据,但部分国家的名称拼写不一致(例如调查中为"SOUTH KOREA",得分数据中为"KOREA- REPUBLIC OF"),直接合并时这些国家的得分会因名称不匹配变为NA值。

我已整理好名称对应关系数据框name_mapping,包含标准名称(correct_names)和错误名称(incorrect):

correct_namesincorrect
BOSNIA AND HERZEGOVINABOSNIA HERZEGOVINA
CONGO- THE DEMOCRATIC REPUBLIC OF THEDEMOCRATIC REPUBLIC OF CONGO
IRAN- ISLAMIC REPUBLIC OFIRAN
KOREA- REPUBLIC OFSOUTH KOREA
LIBYAN ARAB JAMAHIRIYALIBYA
MALDIVESNONE
MARTINIQUENONE
MAYOTTENONE
MOLDOVA- REPUBLIC OFMOLDOVA
RUSSIAN FEDERATIONRUSSIA
SYRIAN ARAB REPUBLICSYRIA
TAIWAN- PROVINCE OF CHINATAIWAN
TANZANIA- UNITED REPUBLIC OFTANZANIA
UNITED ARAB EMIRATESNONE
VIET NAMVIETNAM

实现方法

以下是几种在R中实现错误名称替换的常用方案:

方法1:使用dplyr的recode函数(推荐)

先将映射关系转换为命名向量,再批量替换:

# 加载dplyr包
library(dplyr)

# 示例调查数据框
survey_df <- data.frame(
  country = c("SOUTH KOREA", "IRAN", "RUSSIA", "VIETNAM", "GERMANY"),
  responses = c(10, 15, 8, 12, 20),
  stringsAsFactors = FALSE
)

# 构建名称映射数据框(和你提供的一致)
name_mapping <- data.frame(
  correct_names = c(
    "BOSNIA AND HERZEGOVINA",
    "CONGO- THE DEMOCRATIC REPUBLIC OF THE",
    "IRAN- ISLAMIC REPUBLIC OF",
    "KOREA- REPUBLIC OF",
    "LIBYAN ARAB JAMAHIRIYA",
    "MALDIVES",
    "MARTINIQUE",
    "MAYOTTE",
    "MOLDOVA- REPUBLIC OF",
    "RUSSIAN FEDERATION",
    "SYRIAN ARAB REPUBLIC",
    "TAIWAN- PROVINCE OF CHINA",
    "TANZANIA- UNITED REPUBLIC OF",
    "UNITED ARAB EMIRATES",
    "VIET NAM"
  ),
  incorrect = c(
    "BOSNIA HERZEGOVINA",
    "DEMOCRATIC REPUBLIC OF CONGO",
    "IRAN",
    "SOUTH KOREA",
    "LIBYA",
    "NONE",
    "NONE",
    "NONE",
    "MOLDOVA",
    "RUSSIA",
    "SYRIA",
    "TAIWAN",
    "TANZANIA",
    "NONE",
    "VIETNAM"
  ),
  stringsAsFactors = FALSE
)

# 过滤掉无需替换的"NONE"条目,生成命名向量(错误名为键,标准名为值)
name_vec <- name_mapping %>%
  filter(incorrect != "NONE") %>%
  tibble::deframe()

# 批量替换国家名称,未匹配的名称保持不变
survey_df <- survey_df %>%
  mutate(country = recode(country, !!!name_vec, .default = country))

方法2:基础R实现(无需额外包)

利用match和ifelse完成替换:

# 过滤有效映射(排除NONE)
valid_mapping <- name_mapping[name_mapping$incorrect != "NONE", ]

# 找到每个错误名称对应的标准名称索引
match_idx <- match(survey_df$country, valid_mapping$incorrect)

# 替换名称,无匹配项保留原名称
survey_df$country <- ifelse(
  !is.na(match_idx),
  valid_mapping$correct_names[match_idx],
  survey_df$country
)

方法3:使用case_when(适合少量替换场景)

如果需要替换的条目不多,可以直接用case_when逐个定义规则:

survey_df <- survey_df %>%
  mutate(country = case_when(
    country == "BOSNIA HERZEGOVINA" ~ "BOSNIA AND HERZEGOVINA",
    country == "DEMOCRATIC REPUBLIC OF CONGO" ~ "CONGO- THE DEMOCRATIC REPUBLIC OF THE",
    country == "IRAN" ~ "IRAN- ISLAMIC REPUBLIC OF",
    country == "SOUTH KOREA" ~ "KOREA- REPUBLIC OF",
    country == "LIBYA" ~ "LIBYAN ARAB JAMAHIRIYA",
    country == "MOLDOVA" ~ "MOLDOVA- REPUBLIC OF",
    country == "RUSSIA" ~ "RUSSIAN FEDERATION",
    country == "SYRIA" ~ "SYRIAN ARAB REPUBLIC",
    country == "TAIWAN" ~ "TAIWAN- PROVINCE OF CHINA",
    country == "TANZANIA" ~ "TANZANIA- UNITED REPUBLIC OF",
    country == "VIETNAM" ~ "VIET NAM",
    TRUE ~ country  # 其他名称保持不变
  ))

注意事项

  • 确保名称大小写一致:如果数据中存在大小写混合的情况,可先统一转换为大写或小写,例如survey_df$country <- toupper(survey_df$country)
  • 处理特殊值:映射中incorrect为"NONE"的条目无需替换,直接过滤即可
  • 替换完成后,使用标准名称与得分数据框合并,即可避免因名称不匹配产生的NA值

内容的提问来源于stack exchange,提问作者Reza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:31:03