国家代码包无法将 "SOM" 识别为索马里的 ISO3 字符代码 - r

countrycode package not recognizing "SOM" as ISO3 character code for Somalia - r

尝试从 ISO3 字符代码转换为世界银行代码时,我得到了一个奇怪的结果。值得注意的是,ISO3

不承认索马里

索马里 ISO3 字符代码是 "SOM": https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3

示例:

library(countrycode)
place <- data.frame("iso3c" = "SOM")

place
  iso3c
1   SOM

place$wb <- countrycode(sourcevar = place$iso3c, origin = "iso3c", destination = "wb")
Warning message:
In countrycode(sourcevar = place$iso3c, origin = "iso3c", destination = "wb") :
  Some values were not matched unambiguously: SOM

place
  iso3c   wb
1   SOM <NA>

由于索马里的世界银行代码也是 SOM,我可以通过设置 nomatch = NULL.

来解决这个问题
place$wb <- countrycode(sourcevar = place$iso3c, origin = "iso3c", destination = "wb", nomatch = NULL)
place
  iso3c  wb
1   SOM SOM

但这种行为似乎仍然是错误的。我是不是遗漏了什么或者这是一个错误?

问题是,出于某种原因,世界银行词典中没有索马里的任何代码 wb:

countrycode::codelist[227, c("country.name.en", "iso3c", "wb")]
#     country.name.en iso3c   wb
# 227         Somalia   SOM <NA>

此外,

table(is.na(countrycode::codelist[227, ]))
#
# FALSE  TRUE 
#   678     3 

这三个 NA 案例是

#     eu28   wb wb.name
# 227 <NA> <NA>    <NA>

所以,这看起来很巧合。但是,我们也有

grep("wb", colnames(countrycode::codelist))
# [1] 53 54 55 56 57

countrycode::codelist[227, 53:57]
#       wb wb_api.name wb_api2c wb_api3c wb.name
# 227 <NA>     Somalia       SO      SOM    <NA>

这样也许您可以使用 wb_api3c 代替:

(place$wb <- countrycode(sourcevar = place$iso3c, origin = "iso3c", destination = "wb_api3c"))
# [1] "SOM"

尽管countrycode::codelist[, "wb_api3c"]也有一些缺失值。

这是一个错误。我提交了 issue here.

我认为当前最可取的解决方法(直到它被修复)是...

place$wb <- countrycode(sourcevar = place$iso3c, origin = "iso3c", destination = "wb", custom_match = c("SOM" = "SOM"))

这使得正在发生的事情变得非常清楚,并且易于删除if/when错误已修复。