2016-08-03 71 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“) –