使用匹配的国家/地区名称绑定数据框

时间:2016-08-03 09:36:01

标签: r dataframe merge match

我有两个国家/地区数据数据框。 df1拥有世界上所有国家/地区。 df2有一部分国家/地区,但其中一个列中包含人口。 我想获取人口数据并将其添加到国家/地区名称匹配的df1

如果df1$Column1 = df2$Column1(国家/地区名称相同),则使用df1$Column2(国家/地区人口)中的信息填充df2$Column2(当前为空),其中行是那个国家的比赛。

我尝试使用列#34; Name"合并两者。他们都有国名:

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

列都在那里,但我的新数据帧中有空行。

我希望能够对df1(国家/地区)中的行和列矩阵位置说出&#34;获取行(国家名称在df2中匹配)和列X(人口数据)。然后将它放在df1中的此行和列Y矩阵位置(匹配的国家/地区名称的df1中的新人口列)&#34; ...必须有一个更简单的方法: - )< / p>

以下是我的代码:我想在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")

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以在R中使用sqldf库。

只需按照以下代码操作即可。您将能够合并(加入)您拥有的两个数据集:

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-programming !!!

答案 1 :(得分:0)

要显示其他数据集中没有匹配的第一个数据集行,您只需添加https://cloud.seafile.com/u/d/98233edf89/选项,如下所示(有关详细信息,请查看the documentation):

all.x=T

这些行随后会在第二个数据集列中显示total <- merge(map,Co2_2x, by="NAME",all.x=T)

如果匹配似乎不起作用,您可能需要确保匹配变量(在您的情况下为NA)在两个数据集中以相同的方式填充(字母大小写,可能的空格)在四肢...)。 This answer提供了一种很好的方法。