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

Jen*_*ens 35 merge r polygon spatial dataframe

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

现在,我试过了

oo <- merge(SPDF,DF, by="QDGC", all=T)
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!延

Ram*_*ath 44

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

sp@data = data.frame(sp@data, df[match(sp@data[,by], df[,by]),])
Run Code Online (Sandbox Code Playgroud)

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


TMS*_*TMS 18

这很容易:

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

oo <- merge(SPDF,DF, by="QDGC")
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我来说真的很好用!但是,我认为值得指出的是,如果数据帧和SPDF没有相同的行数,则可能会出现一些问题.我不断收到由此问题引起的错误("对象数量不匹配").最后,我能够通过添加"all.x = TRUE"(其中x是SPDF)来执行合并. (2认同)

Spa*_*man 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)
Run Code Online (Sandbox Code Playgroud)

如果你得到错误的行数:

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
Run Code Online (Sandbox Code Playgroud)