如何将简单的 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*DataFrames,会有什么不同? 如果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 的意义上,我们希望在这里有类似joinmerge 的东西。

忽略这个事实,函数对于确保连接正确以及某些行仅出现在连接的一侧非常有用。来自文档:

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

以上是关于如何将简单的 data.frame 附加到 R 中的 SpatialPolygonDataFrame?的主要内容,如果未能解决你的问题,请参考以下文章

附加到大型 data.frame 并达到内存限制

根据R中data.frame行中类的频率分配类

如何将行附加到 R 数据框

将列表附加到R中的数据框

以节省内存的方式增长 data.frame

有没有一种有效的方法可以附加到现有的 csv 文件而不在 R 中重复?