【问题标题】:Binding dataframes with matching country names绑定具有匹配国家名称的数据框
【发布时间】:2016-12-08 22:51:20
【问题描述】:

我有两个国家数据的数据框。 df1 拥有世界所有国家。 df2 有一个国家的子集,但其中一个列中有人口。 我想获取人口数据并将其添加到国家名称匹配的df1

如果df1$Column1 = df2$Column1(相同的国家/地区名称),则使用来自df2$Column2(国家/地区的人口)的信息填充df1$Column2(当前为空),其中该行与该国家/地区匹配。

我尝试使用它们都有的国家名称列“名称”来合并两者:

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

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

我想说“对于df1(国家)中的这一行和列矩阵位置,获取行(df2中的国家名称匹配)和列X(人口数据)。然后把它在df1 中的这一行和列 Y 矩阵位置(df1 中的新人口列用于匹配的国家名称)“......必须有一个更简单的方法:-)

这是我的代码:我想用来自Co2_2x$premium 的国家/地区匹配的数据填充map$measure

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")

谢谢!

【问题讨论】:

  • 嗨,彼得,欢迎来到 SO。你试图解决你的问题是什么?我们必须知道这一点才能给出适当的建议。
  • 嗨,文森特,我尝试使用它们都有的国家名称列“名称”来合并两者。 total
  • 好的。你能在你的问题中而不是在评论中解释一下吗?
  • 谢谢,你的问题已经好多了!我们也喜欢您提供一些代码来总结您的数据 (df1&lt;-data.frame(...))。这样,我们就可以直接运行您的代码,查看究竟发生了什么,并更快地找到解决方案。另外,提供代码时不要忘记使用代码块。

标签: r dataframe merge match


【解决方案1】:

你可以在 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 编程愉快!!!

【讨论】:

  • > merge_data
  • 我的 df "map" 有一个名为 "NAME" 的列。他们都把它作为国家名称的列......我做错了什么吗?
  • 我试过这个并添加了列,但列中的所有项目都是“NA”:库(sqldf)merged_data
  • @PeterNsanze 您的 SQL 查询错误...我正在粘贴正确的...sqldf("select a.NAME, b.premium from map as a left join Co2_2x as b on (a.NAME = b.NAME) group by 1")
【解决方案2】:

要显示其他数据集中不匹配的第一个数据集行,您只需添加all.x=T 选项,如下所示(详情请查看the documentation):

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

这些行随后将在第二个数据集列中显示为 NA

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

【讨论】:

  • 谢谢。这有点用。我添加了列,但每个字段中的所有数据都是“NA”。
  • 我希望我可以下载正确的表...但是使用我使用的测试 DF,NA 仅在 df1 的 x 值与 df2 不匹配时出现。您确定这两个名称列真的匹配吗?例如,一个末尾可能有空格?
  • 是的!一个有“中国”,另一个有“中国”,有空格。 :-)
  • 太棒了!我猜你已经以某种方式摆脱了这些,但你可能想看看这种优雅的方式:stackoverflow.com/questions/10688137/…
猜你喜欢
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多