如何在R语言中将数据框中的错误国名替换为标准名称?
在R中统一国家名称拼写:替换错误名称为标准名称
问题背景
我手头有两个数据框:一个是包含特定拼写国家名称的调查数据,另一个是记录各国得分的数据,但部分国家的名称拼写不一致(例如调查中为"SOUTH KOREA",得分数据中为"KOREA- REPUBLIC OF"),直接合并时这些国家的得分会因名称不匹配变为NA值。
我已整理好名称对应关系数据框name_mapping,包含标准名称(correct_names)和错误名称(incorrect):
| correct_names | incorrect |
|---|---|
| BOSNIA AND HERZEGOVINA | BOSNIA HERZEGOVINA |
| CONGO- THE DEMOCRATIC REPUBLIC OF THE | DEMOCRATIC REPUBLIC OF CONGO |
| IRAN- ISLAMIC REPUBLIC OF | IRAN |
| KOREA- REPUBLIC OF | SOUTH KOREA |
| LIBYAN ARAB JAMAHIRIYA | LIBYA |
| MALDIVES | NONE |
| MARTINIQUE | NONE |
| MAYOTTE | NONE |
| MOLDOVA- REPUBLIC OF | MOLDOVA |
| RUSSIAN FEDERATION | RUSSIA |
| SYRIAN ARAB REPUBLIC | SYRIA |
| TAIWAN- PROVINCE OF CHINA | TAIWAN |
| TANZANIA- UNITED REPUBLIC OF | TANZANIA |
| UNITED ARAB EMIRATES | NONE |
| VIET NAM | VIETNAM |
实现方法
以下是几种在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
相关产品推荐
相关产品推荐

