我(再次)在R中组合数据帧存在问题。但这一次,一个是SpatialPolygonDataFrame(SPDF
),另一个是通常的data.frame(DF
)。 SPDF
大约有1000行,DF
只有400行。两者都有一个共同的列,QDGC
现在,我试过
oo <- merge(SPDF,DF, by="QDGC", all=T)
但这只会导致正常的data.frame,而不再是空间多边形数据框。 我在其他地方读到,这不起作用,但我不明白在这种情况下该做什么(必须对ID列做一些事情,合并使用)
哦,这么难的问题,我决定......
谢谢! 延
答案 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)
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_coverage
和over_coverage
覆盖率低于覆盖率的密钥 可以检索上一次append_data调用的值,
答案 5 :(得分:0)
如果是两个shapefile需要合并为一个对象,使用rbind()
即可。
使用 rbind()
时,只需确保您使用的两个参数都是 SpatialDataFrames
。您可以使用 class(sf)
进行检查。如果它不是数据帧,则在 rbind 之前使用 st_as_sf()
将它们转换为 SpatialDataFrame
。
注意:您也可以使用它来附加到 NULLs
,特别是当您使用循环的结果并且您想要累积结果时。