如何将简单的data.frame附加到R中的SpatialPolygonDataFrame?

时间:2010-09-06 10:15:42

标签: r merge polygon spatial dataframe

我(再次)在R中组合数据帧存在问题。但这一次,一个是SpatialPolygonDataFrame(SPDF),另一个是通常的data.frame(DF)。 SPDF大约有1000行,DF只有400行。两者都有一个共同的列,QDGC

现在,我试过

oo <- merge(SPDF,DF, by="QDGC", all=T)

但这只会导致正常的data.frame,而不再是空间多边形数据框。 我在其他地方读到,这不起作用,但我不明白在这种情况下该做什么(必须对ID列做一些事情,合并使用)

哦,这么难的问题,我决定......

谢谢! 延

6 个答案:

答案 0 :(得分:42)

设df =数据帧,sp =空间多边形对象和=公共列的名称或列号。然后,您可以使用以下代码行将数据框合并到sp对象中

sp@data = data.frame(sp@data, df[match(sp@data[,by], df[,by]),])

以下是代码的工作原理。内部匹配函数对齐列,以便保留顺序。因此,当我们将它与sp @ data合并时,订单会被正确保留。快速检查代码是否有效是检查对应于公共列的两列,看看它们是否相同(公共列是重复的,很容易删除副本,但我保留它,因为它是一个好检查)

答案 1 :(得分:18)

这很容易:

require(sp) # the trick is that this package must be loaded!

oo <- merge(SPDF,DF, by="QDGC")

我自己测试过。但它只有在您使用merge from package sp时才有效。这是加载sp包时的默认值。然后重载merge函数,如果第一个参数是空间结构,则使用sp::merge

答案 2 :(得分:6)

如果两个数据帧没有简单的1-1映射,则

merge可以生成比原始行更多的行的数据帧。在这种情况下,它必须复制所有几何体并创建多个多边形,这可能不是一件好事。

如果您的数据框与SpatialPointsDataFrame的行数相同,那么您可以直接替换@data插槽。

library(sp)
example(overlay) # to get the srdf object
srdf@data
spplot(srdf)
srdf@data=data.frame(x=runif(3),xx=rep(0,3))
spplot(srdf)

如果你的行数错误:

srdf@data=data.frame(x=runif(2),xx=rep(0,2))
spplot(srdf)
Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 3, 2

答案 3 :(得分:2)

也许rworldmap包中的函数joinCountryData2Map可以给予灵感。 (但我可能错了,就像我上次一样。)

答案 4 :(得分:0)

另一个解决方案是使用tmaptools包中的append_data函数。用这些参数调用它:

append_data(shp, data, key.shp = NULL, key.data = NULL,
  ignore.duplicates = FALSE, ignore.na = FALSE,
  fixed.order = is.null(key.data) && is.null(key.shp))

它有点不幸被称为追加,因为我理解追加更多rbind的感觉,我们希望有类似join或{{merge的东西。 1}}这里。

忽略这一事实,函数确实可以确保连接正确,并且某些行仅存在于连接的一侧。来自文档:

  

在覆盖范围内(与数据记录不对应的形状项),   覆盖范围(与形状项不对应的数据记录   分别)以及重复键值的存在   通过控制台消息自动检查和报告。同   under_coverageover_coverage覆盖率低于覆盖率的密钥   可以检索上一次append_data调用的值,

答案 5 :(得分:0)

如果是两个shapefile需要合并为一个对象,使用rbind()即可。

使用 rbind() 时,只需确保您使用的两个参数都是 SpatialDataFrames。您可以使用 class(sf) 进行检查。如果它不是数据帧,则在 rbind 之前使用 st_as_sf() 将它们转换为 SpatialDataFrame

注意:您也可以使用它来附加到 NULLs,特别是当您使用循环的结果并且您想要累积结果时。