我有两个数据框架,其中一个公共列包含世界各国的名称。但是这两种数据框架并不遵循相同的国家名称格式。例如,一个数据框显示朝鲜,而另一个显示朝鲜民主主义人民共和国。另一个例子是,一个数据框中的马其顿,而另一个数据框中的是前南斯拉夫的马其顿共和国。
我正在寻找一种将两个数据帧合并到此国家/地区列的方法,因为它是唯一的公共列。我将不得不在许多不同的数据帧上多次执行此操作。
我试过了
t<-as.data.frame(sapply(data, function(x) gsub("Yugoslav", "Macedonia",x)))
但这会在数据帧中搜索“南斯拉夫”一词,仅替换“南斯拉夫”,而不是整个“前南斯拉夫的马其顿共和国”。
感谢帮助。
国家代码
包是您的朋友。描述:
标准化国家名称,将其转换为十一种编码方案之一,在编码方案之间进行转换,并分配区域描述符。
例如。。。
countrycode(c("Macedonia", "The former Yugoslav Republic of Macedonia"), "country.name", "country.name")
[1] "Macedonia, the former Yugoslav Republic of"
[2] "Macedonia, the former Yugoslav Republic of"
countrycode(c("North Korea", "Dem People's Rep of Korea"), "country.name", "iso3c")
[1] "PRK" "PRK"
您可以结合使用
RgoogleMaps
coords2country()
将纬度和经度坐标转换为R中的国家名称以匹配国家名称。示例代码如下:
library(RgoogleMaps)
library(sp)
library(rworldmap)
# <-- Copy code for coords2country here. -->
# Geocode location names.
geo_1 <- getGeoCode("Dem People's Rep of Korea")
geo_2 <- getGeoCode("North Korea")
# Transform geocodes to appropriate data tables.
geo_1 <- data.table(t(rev(geo_1)))
geo_2 <- data.table(t(rev(geo_2)))
# Reverse geocode coordinates to country names.
country_1 <- as.character(coords2country(geo_1))
country_2 <- as.character(coords2country(geo_2))
当country_1
和country_2
相同时,您开始的位置很可能相同。当然没有什么保证。
@dash2已经提供了我认为最好的答案,假设你正在使用国家名称,但是,如果你正在寻找更一般的东西和/或完全达到这个问题的标题要求的东西,或者更接近你的例子,这里有一个想法…
gsub
的第一个/pattern
参数是正则表达式,因此您可以通过在匹配字符串前后添加“.*”来匹配匹配字符串前后的任何字符。。。
gsub(".*Yugoslav.*", "Macedonia", "The former Yugoslav Republic of Macedonia")
所以你上面的例子,听起来像你想要的样子...
t<-as.data.frame(sapply(data, function(x) gsub(".*Yugoslav.*", "Macedonia",x)))
注意:gsub
是矢量化的,即它接受x
参数的字符矢量,因此不需要运行sapply
。以下两个命令大致相当(尽管saply会为结果添加名称)。。。
sapply(data, function(x) gsub("Yugoslav", "Macedonia",x))
gsub("Yugoslav", "Macedonia", data)
因此,您的确切示例的更好版本是...
t <- as.data.frame(gsub(".*Yugoslav.*", "Macedonia", data))
假设您有一个数据框df
,其中包含字符串的列/向量名为国家
,以下代码将(完全)将存量数据框中包含“南斯拉夫”的任何值更改为“马其顿”(包括诸如“前南斯拉夫的马其顿共和国”之类的字符串)…
df$country <- gsub(".*Yugoslav.*", "Macedonia", df$country)
对于要交换的每组字符串,您需要一个单独的命令,因此,如果您要进行许多更改,我认为这不是实现它的最佳方法,但也许您只对进行一些更改感兴趣,或者出于某种原因,您可能想手动执行每个更改。