2017-03-28 40 views
1

我有两个dataframes与包含世界上的国家名称的公共列。但是这两个数据框都不遵循相同格式的国名。例如,一个数据框表示朝鲜,另一个表示朝鲜民主主义人民共和国。另一个例子是马其顿在一个数据框中,另一个例子是前南斯拉夫的马其顿共和国。更换在数据帧的山坳整个字符串基于字符的单元格中包含,R中

我正在寻找一种方式来对这个国家列合并两个dataframes,因为它是唯一的公共列。我将不得不在多个不同的数据框上多次执行此操作。

我试图

t<-as.data.frame(sapply(data, function(x) gsub("Yugoslav", "Macedonia",x))) 

但这搜索单词在数据帧南斯拉夫和只替换南斯拉夫,而不是整个的马其顿前南斯拉夫马其顿共和国。

帮助赞赏。

+0

如果投了票,请提供原因。 – tg110

+0

根据国家数量,我可能会建立一个查找表(一个命名向量),并使用它来转换其中一列或构建一个新列。请参阅SO文档中的[本文](http://stackoverflow.com/documentation/r/1088/creating-vectors#t=201703281744454924664)。没有示例数据,很难提供更多的建议。 – lmo

+0

@ lmo-大约有25-30个国家。我会研究你提供的链接。至于数据 - 我已经解释了几乎所有的数据。 df1中某一列中的国家/地区名称需要与df2中的一列中的国家/地区名称匹配 – tg110

回答

1

countrycode包是你的朋友。说明:

标准化的国名,将它们转换为11的一个编码 方案,编码方案之间进行转换,并指定区域 描述。

例如...

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" 
+0

@ dash2-并非如此。我使用的数据集不遵循包中的任何方案。 我也研究过这个。 – tg110

+0

@ tg110您表示您的数据集包含国家/地区名称...... countrycode包明确与国家/地区名称一起使用......例如国家代码(数据$国家,“country.name”,“iso3c”) –

+0

@ tg110或特定于您的问题的一些更好的例子... countrycode(c(“马其顿”,“前南斯拉夫的马其顿共和国”),“国家。名称”, “country.name”) 将返回...... [1] “马其顿” [2] “马其顿” COUNTRYCODE前南斯拉夫共和国(三前南斯拉夫共和国( “朝鲜”,“朝鲜民主主义人民共和国”),“country.name”,“iso3c”) 将返回... [1]“PRK”“PRK” –

0

您可以使用

以匹配国家/地区名称。下面的示例代码:

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_1country_2是你开始用相同的,那么位置很可能是相同的。当然没有保证。

0

@ 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运行它。以下两条命令都大致相当(虽然sapply加名的结果)...

sapply(data, function(x) gsub("Yugoslav", "Macedonia",x)) 
gsub("Yugoslav", "Macedonia", data) 

所以一个更好的版本你确切的例子是...

t <- as.data.frame(gsub(".*Yugoslav.*", "Macedonia", data)) 

假设您有一个数据框df,其中包含一个名为country的列/向量,其中包含字符串,以下代码将(全部)更改包含“南斯拉夫”到“马其顿”的任何值(包括诸如“前南斯拉夫的马其顿共和国”之类的字符串)在现有的da中TA帧...

df$country <- gsub(".*Yugoslav.*", "Macedonia", df$country) 

您将需要一个单独的命令为每一组要交换的字符串,所以我不认为这是实现它,如果你有很多的变化做出最好的办法,但也许你只是想做一些改变,或者你可能因为某种原因想手动做每一项改变。

相关问题