2016-08-03 58 views
0

我有兩個國家數據的數據幀。 df1有世界上所有的國家。 df2有一個國家的子集,但在其中的一列中有人口。 我想獲取人口數據並將其添加到國家/地區名稱匹配的df1用匹配的國家名稱綁定數據幀

如果df1$Column1 = df2$Column1(同一個國家的名字),然後用從df2$Column2(全國人口),其中行是一個給該國匹配信息填充df1$Column2(當前爲空)。

我試圖合併兩個使用列「姓名」,他們都有爲國名:

total <- merge(map,Co2_2x, by="NAME") 

列都在那裏,但我得到了我的新數據框中空行。

我希望能夠對df1(國家)中的這一行和列矩陣位置說出行(國名匹配df2)和列X(人口數據),然後將它放入在df1(新的人口列匹配的國名在df1)該行和列Y矩陣位置」 ......必須有一個更簡單的方法:-)

這裏是我的代碼:我想填補map$measure與國家匹配的Co2_2x$premium的數據。

library(XML) 
library(raster) 
library(rgdal) 
download.file("http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip",destfile="TM_WORLD_BORDERS_SIMPL-0.3.zip") 
unzip("TM_WORLD_BORDERS_SIMPL-0.3.zip",exdir=getwd()) 
polygons <- shapefile("TM_WORLD_BORDERS_SIMPL-0.3.shp") 

polygons 
map <- as.data.frame(polygons) 

map$Measure <- 0 

library(rvest) 
Co2 <- read_html("https://en.wikipedia.org/wiki/List_of_countries_by_carbon_dioxide_emissions") 

Co2_2x<-Co2 %>% 
    html_nodes("table") %>% 
    .[[1]] %>% 
    html_table() 

names(Co2_2x)[2]<-paste("premium") 

names(Co2_2x)[1]<-paste("NAME") 


total <- merge(map,Co2_2x, by="NAME") 

謝謝!

+0

嗨,彼得,歡迎來到SO。你試圖解決你的問題是什麼?我們必須知道,給予適當的建議。 – Vincent

+0

嗨文森特,我試圖合併兩個使用他們都有國名的列「名稱」。總共< - merge(map,Co2_2x,by =「NAME」)但是我在我的新數據框中得到了空行,但是列都在那裏。 –

+0

好的。你能否請你在你的問題而不是在評論中解釋這一點? – Vincent

回答

0

要讓第一個數據集的行與其他數據集不匹配出現,你只需要添加all.x=T選項,如下所示(看看the documentation瞭解詳細信息):

total <- merge(map,Co2_2x, by="NAME",all.x=T) 

這些行會然後在第二個數據集列中出現NA

如果匹配似乎不工作,你可能希望確保您的匹配變量(在你的情況,NAME)填充exaclty在兩個數據集以同樣的方式(信件情況下,在四肢可能空間...)。 This answer提供了一個很好的方法。

+0

謝謝。這有點奏效。我添加了列,但是他們的所有數據在每個字段都是「NA」。 –

+0

我希望我可以下載適當的表格......但是通過我使用的測試DF,只有當'df2'中的'df1'的x值不匹配時纔會出現'NA'。你確定這兩個名字欄真的匹配嗎?例如,最後可能有空格? – Vincent

+0

是的!一個擁有「中國」,另一個擁有「中國」的空間。 :-) –

0

可以使用sqldf庫R.

只要按照下面的代碼。您可以合併(連接)兩個數據集,你必須:

library(sqldf) 
merged_data <- sqldf("select a.country, b.population from df1 as a 
        left join df2 as b on (a.country = b.country) group by 1") 

感謝,並愉快R-編程!

+0

> merged_data < - sqldf(「select map.NAME,Co2_2x.premium from map as left left join Co2_2x as NAME on(map.NAME = Co2_2x.NAME)group by 1」) sqliteSendQuery錯誤(con,statement,bind .data): 錯誤聲明:沒有這樣的列:map.NAME –

+0

我的df「map」有一個名爲「NAME」的列。他們都把它作爲國名的專欄......我做了其他錯誤嗎? –

+0

我嘗試這樣做,並獲得加列,但列中的所有項目都是「NA」:圖書館(sqldf) merged_data < - sqldf(「選擇地圖* ,Co2_2x.premium 從地圖 左加入Co2_2x 上。 map.NAME = Co2_2x.NAME「) –