【发布时间】:2017-11-27 11:40:38
【问题描述】:
我有一个数据框,其中一列代表国家/地区名称。我的目标是再添加一列提供大陆信息。请检查以下用例:
my.df <- data.frame(country = c("Afghanistan","Algeria"))
是否有一个包可用于在不包含原始数据的情况下附加包含大陆名称的数据列?
【问题讨论】:
标签: r
我有一个数据框,其中一列代表国家/地区名称。我的目标是再添加一列提供大陆信息。请检查以下用例:
my.df <- data.frame(country = c("Afghanistan","Algeria"))
是否有一个包可用于在不包含原始数据的情况下附加包含大陆名称的数据列?
【问题讨论】:
标签: r
您可以使用countrycode 包来完成此任务。
library(countrycode)
df <- data.frame(country = c("Afghanistan",
"Algeria",
"USA",
"France",
"New Zealand",
"Fantasyland"))
df$continent <- countrycode(sourcevar = df[, "country"],
origin = "country.name",
destination = "continent")
#warning
#In countrycode(sourcevar = df[, "country"], origin = "country.name", :
# Some values were not matched unambiguously: Fantasyland
结果
df
# country continent
#1 Afghanistan Asia
#2 Algeria Africa
#3 USA Americas
#4 France Europe
#5 New Zealand Oceania
#6 Fantasyland <NA>
【讨论】:
扩展 Markus 的答案,countrycode 借鉴了 codelists 的“大陆”声明。
?codelist
continent的定义:
大陆:世界银行发展指标中定义的大陆
该问题针对大洲提出,但有时大洲没有提供足够的组供您描绘数据。例如,continents 将北美和南美分组为Americas。
你可能想要的是region:
区域:世界银行发展指标中定义的区域
目前尚不清楚世界银行如何对区域进行分组,但以下代码显示了该目的地如何更加细化。
library(countrycode)
egnations <- c("Afghanistan","Algeria","USA","France","New Zealand","Fantasyland")
countrycode(sourcevar = egnations, origin = "country.name",destination = "region")
输出:
[1] "Southern Asia"
[2] "Northern Africa"
[3] "Northern America"
[4] "Western Europe"
[5] "Australia and New Zealand"
[6] NA
【讨论】:
你可以试试
my.df <- data.frame(country = c("Afghanistan","Algeria"),
continent= as.factor(c("Asia","Africa")))
merge(my.df, raster::ccodes()[,c("NAME", "CONTINENT")], by.x="country", by.y="NAME", all.x=T)
# country continent CONTINENT
# 1 Afghanistan Asia Asia
# 2 Algeria Africa Africa
一些country 值可能需要调整;我不知道,因为您没有提供所有值。
【讨论】: