2017-03-28 70 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) 

您將需要一個單獨的命令爲每一組要交換的字符串,所以我不認爲這是實現它,如果你有很多的變化做出最好的辦法,但也許你只是想做一些改變,或者你可能因爲某種原因想手動做每一項改變。

相關問題