【问题标题】:How to attach a simple data.frame to a SpatialPolygonDataFrame in R?如何将简单的 data.frame 附加到 R 中的 SpatialPolygonDataFrame?
【发布时间】: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 列做一些事情,合并使用)

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

谢谢! 延斯

【问题讨论】:

标签: r merge polygon spatial dataframe


【解决方案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 的意义上,我们希望在这里有类似join 或merge 的东西。

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-10-26
        • 1970-01-01
        • 2011-12-16
        • 2011-12-28
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        相关资源
        最近更新 更多