国家代码包无法将 "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错误已修复。
尝试从 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错误已修复。