使用forcats包fct_recode()时因撇号格式报错Unknown levels
解决fct_recode()中「Korea, Dem. People’s Rep.」的未知水平错误
嘿,我之前处理联合国数据集时也踩过这个一模一样的坑!这个错误90%是因为**智能弯引号(’)和普通直引号(')**的差异——R对字符的识别完全严格,哪怕只是引号类型不一样,都会被当成两个完全不同的字符串。
快速解决方法
方法1:直接复制精确的因子水平
先把有问题列的唯一值输出,复制那个100%准确的国家名称,避免手动输入出错:
# 输出该列的唯一因子水平,拿到精确名称 dput(unique(your_data$country_column))
你会看到类似这样的输出:c("Korea, Dem. People’s Rep.", "China", ...),把里面的「Korea, Dem. People’s Rep.」直接粘贴到fct_recode()里:
library(forcats) your_data$country_column <- fct_recode(your_data$country_column, "North Korea" = "Korea, Dem. People’s Rep." # 用复制的精确名称,不要手动打 )
方法2:统一引号格式
如果不想复制,可以先把所有弯引号替换成直引号,再进行重编码:
library(forcats) library(stringr) your_data$country_column <- your_data$country_column %>% as.character() %>% # 先转字符型方便替换 str_replace_all("’", "'") %>% # 把弯引号批量换成直引号 as.factor() %>% # 转回因子 fct_recode("North Korea" = "Korea, Dem. People's Rep.") # 用直引号的名称重编码
进阶排查与优化
你已经用anti_join()和unique()排查了,这里再给个小技巧:用setdiff()快速对比两个数据框的国家名称差异,能更直观看到所有不匹配的项:
# 查看df1有但df2没有的国家名称 setdiff(df1$country_column, df2$country_column) # 查看df2有但df1没有的国家名称 setdiff(df2$country_column, df1$country_column)
另外,处理国家名称合并时,其实可以用countrycode包跳过名称拼写的麻烦——直接统一转换成ISO国家代码,再按代码合并,容错率高很多:
library(countrycode) # 给两个数据框都添加ISO3标准国家代码 df1$iso3c <- countrycode(df1$country_column, "country.name", "iso3c") df2$iso3c <- countrycode(df2$country_column, "country.name", "iso3c") # 按ISO代码合并,再也不用纠结名称拼写细节 merged_df <- merge(df1, df2, by = "iso3c", all = TRUE)
内容的提问来源于stack exchange,提问作者Willdebras
相关产品推荐
相关产品推荐

