尝试从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
但是这种行为似乎仍然是错误的。我是否缺少某些东西或这是一个错误?
答案 0 :(得分:3)
问题是由于某种原因,世界银行字典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"]
也有许多缺失值。
答案 1 :(得分:1)
这是一个错误。我提交了issue here。
我认为目前最可取的解决方法(直到它被修复)是...
place$wb <- countrycode(sourcevar = place$iso3c, origin = "iso3c", destination = "wb", custom_match = c("SOM" = "SOM"))
这使得它非常清楚正在发生的事情,并且在/已修复错误的情况下很容易将其删除。