如何将简单的 data.frame 附加到 R 中的 SpatialPolygonDataFrame?
Posted
技术标签:
【中文标题】如何将简单的 data.frame 附加到 R 中的 SpatialPolygonDataFrame?【英文标题】:How to attach a simple data.frame to a SpatialPolygonDataFrame in R? 【发布时间】:2011-04-08 17:10:51 【问题描述】:我(再次)在 R 中组合数据帧时遇到问题。但这一次,一个是 SpatialPolygonDataFrame (SPDF
),另一个是通常的 data.frame (DF
)。 SPDF
有大约 1000 行,DF
只有 400。两者都有一个共同的列,QDGC
现在,我试过了
oo <- merge(SPDF,DF, by="QDGC", all=T)
但这只会产生普通的 data.frame,不再是空间多边形数据框。 我在其他地方读到,这不起作用,但我不明白在这种情况下该怎么做(必须对 ID 列做一些事情,合并使用)
哦,这么难的问题,我想......
谢谢! 延斯
【问题讨论】:
2021 年这是相关的49032217 【参考方案1】:令 df = 数据框,sp = 空间多边形对象,by = 名称或公共列的列号。然后您可以使用以下代码行将数据框合并到 sp 对象中
sp@data = data.frame(sp@data, df[match(sp@data[,by], df[,by]),])
以下是代码的工作原理。内部的 match 函数对齐列,以便保留顺序。因此,当我们将其与 sp@data 合并时,会正确保留顺序。快速检查代码是否有效是检查与公共列对应的两列,看看它们是否相同(公共列重复,很容易删除副本,但我保留它,因为它是好检查)
【讨论】:
非常感谢您!你救了我的晚上!也可能是整个星期!效果很好。 @Ramnath 如果空间数据框的行(多边形)多于合并数据,此解决方案是否有效?并且在相反的情况下 - 当在连接数据中有更多的观察? 如果两个对象都是SpatialP*DataFrame
s,会有什么不同?
如果df
也是SpatialP*DataFrame
,我认为您可以尝试用df@data[,by]
替换df
【参考方案2】:
就这么简单:
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
。
【讨论】:
这对我来说非常有效!但是,我认为值得指出的是,如果数据框和 SPDF 的行数不同,可能会出现一些问题。我不断收到此问题引发的错误(“对象数量不匹配”)。最后,我能够通过添加“all.x = TRUE”(其中 x 是 SPDF)来执行合并。 这太棒了,我在 2021 年对其进行了测试。我的 df 的行数比我的 shp 多,但它确实有效。我推荐这个答案。【参考方案3】:如果两个数据帧没有简单的 1-1 映射,则合并可以生成比原始数据帧具有更多行的数据帧。在这种情况下,它必须复制所有几何图形并创建多个多边形,这可能不是一件好事。
如果你有一个与 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
【讨论】:
好的,我做了以下操作:(1) oo 哎哟。我应该检查一下。【参考方案4】:也许rworldmap 包中的函数joinCountryData2Map
可以提供灵感。 (但我可能错了,就像我上次一样。)
【讨论】:
【参考方案5】:另一种解决方案是使用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
的东西。
忽略这个事实,函数对于确保连接正确以及某些行仅出现在连接的一侧非常有用。来自文档:
在覆盖范围内(与数据记录不对应的形状项), 过度覆盖(与形状项目不对应的数据记录 分别)以及重复键值的存在是 通过控制台消息自动检查和报告。和
under_coverage
和over_coverage
覆盖范围不足和覆盖范围 可以检索上一次 append_data 调用的值,
【讨论】:
【参考方案6】:如果是两个shapefile需要合并为一个对象,使用rbind()
即可。
使用rbind()
时,只需确保您使用的两个参数都是SpatialDataFrames
。您可以使用class(sf)
进行检查。如果它不是数据框,则在 rbind 之前使用st_as_sf()
将它们转换为SpatialDataFrame
。
注意:您也可以使用它来追加到NULLs
,尤其是当您使用循环的结果并且想要累积结果时。
【讨论】:
以上是关于如何将简单的 data.frame 附加到 R 中的 SpatialPolygonDataFrame?的主要内容,如果未能解决你的问题,请参考以下文章