【问题标题】:spatialpolygonsdataframe polygons jumbled after merge to join dataspatialpolygonsdataframe 多边形在合并以加入数据后混乱
【发布时间】:2015-08-15 10:00:18
【问题描述】:

我正在尝试使用 R 绘制一些土耳其语数据。

我遇到的问题是,当我将数据与形状文件(以 spatialpolygonsdataframe 格式)合并时,数据不再匹配正确的 pologons。我做错了什么,

下面是一些可重现的代码。形状文件是一些natural earth data(所以公共领域),我把它放在我的谷歌驱动器上,用简单的数据excel文件压缩。 它在合并之前和之后生成 2 个标有省份名称的地块。 您可以看到第二张图像“混乱”了数据,Turkey.map@data 不再匹配正确的多边形。

在使用正确的省份名称合并地块之前: 合并图后:

library(maptools)
library(readxl)

temp <- "TurkeyShapefile.zip"
URL      <- "https://docs.google.com/ucid=0B0TyKM0aACIONUxfNTJwWGhrR0k&export=download"
download.file(URL,temp, mode="wb")
unzip(temp)

trtr <- readShapeSpatial("Natural_earth_admin_RMS150518_TR")

#read excel file
fname <- "TR_data.xlsx"
TRdata <- read_excel(fname, sheet = "pcnt")

Turkey.map <- trtr       #create copy of trtr

#a plot of the map before the merge
plot(Turkey.map)
invisible(text(getSpPPolygonsLabptSlots(Turkey.map), labels=as.character(Turkey.map@data$Admin1Name), cex=0.5))


#merge (join data)
Turkey.map@data <- merge(Turkey.map@data,TRdata,by.x="Admin1Name",by.y="Province", all.x=TRUE)

#a plot of the map after the merge
plot(Turkey.map)
invisible(text(getSpPPolygonsLabptSlots(Turkey.map), labels=as.character(Turkey.map@data$Admin1Name), cex=0.5))

非常感谢!

【问题讨论】:

    标签: r plot merge shapefile maptools


    【解决方案1】:

    如果您对空间对象上的@data 插槽进行任何操作,并且可以以任何方式对其进行重新排序,那么您将进入一个痛苦的世界。通常,您应该通过在匹配数据集之间的 ID 字段上手动调用 which() 来完成所有操作,或者在您的情况下,您可以在 SpatialPolygonsDataFrame 对象本身上调用 merge()

    Turkey.map <- merge(
        Turkey.map, TRdata, 
        by.x="Admin1Name", by.y="Province", 
        all.x=TRUE
    )
    

    很好奇为什么 OP 在将 Spatial* 对象与 data.frame 合并时没有看到正确的输出,这是一个完全可重现的示例,显示了正确的行为:

    library(sp)
    
    ##  Reproducible 10x10 grid of polygons:
    set.seed(2002)
    grd <- GridTopology(c(1,1), c(1,1), c(10,10))
    polys <- as(grd, "SpatialPolygons")
    centroids <- coordinates(polys)
    x <- centroids[,1]
    y <- centroids[,2]
    z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x
    d <- SpatialPolygonsDataFrame(
      polys,
      data=data.frame(
        x=x, y=y, z=z, ID=1:length(x), 
        row.names=row.names(polys)
      )
    )
    
    df <- data.frame("ID"=1:10, color="black")
    
    class(d)
    class(df)
    

    产量:

    class(d)
    [1] "SpatialPolygonsDataFrame"
    attr(,"package")
    [1] "sp"
    class(df)
    [1] "data.frame"
    

    然后将两者合并:

    ##  The merge of a SpatialPolygonsDataFrame and a data.frame:
    dm <- merge(d, df, by.x="ID", by.y="ID", all.x=T)
    
    ##  Verify we still have a Spatial* object:
    class(dm)
    names(dm)
    

    产量:

    class(dm)
    [1] "SpatialPolygonsDataFrame"
    attr(,"package")
    [1] "sp"
    names(dm)
    [1] "ID"    "x"     "y"     "z"     "color"
    
    plot(dm, col=dm$color)
    

    > sessionInfo()
    R version 3.2.1 (2015-06-18)
    Platform: x86_64-w64-mingw32/x64 (64-bit)
    Running under: Windows 8 x64 (build 9200)
    
    locale:
    [1] LC_COLLATE=English_United States.1252 
    [2] LC_CTYPE=English_United States.1252   
    [3] LC_MONETARY=English_United States.1252
    [4] LC_NUMERIC=C                          
    [5] LC_TIME=English_United States.1252    
    
    attached base packages:
    [1] stats     graphics  grDevices
    [4] utils     datasets  methods  
    [7] base     
    
    other attached packages:
    [1] sp_1.1-1
    
    loaded via a namespace (and not attached):
    [1] tools_3.2.1     grid_3.2.1     
    [3] lattice_0.20-31
    

    【讨论】:

    • 那只会创建一个数据框对象,替换同名的 SpatialPolygonsDataFrame 会不会?
    • 不,它返回与您提供合并函数相同的 Spatial* 类对象。
    • 我确实先尝试过,它返回了一个数据框对象!我对合并尝试了 sort=FALSE,我认为在这种情况下可能已经修复了它。谢谢
    • 如果您确实仍在使用data.frame 对象(只要您合并实际的Spatial* 对象而不是它的@data 插槽,您就不应该这样做)您应该'不要仅仅依靠sort=F 来返回一个data.frame 适合粘回Spatial* 对象。原因是在指定 all.x=T 时,任何不匹配的结果仍然会在合并后的 data.frame 对象的底部重新排序。这可能是对未来读者的评论,如果合并确实将您的 Spatial* 对象归还给您。
    • 是的,我使用了您的确切代码,而不是我的合并行。不再是空间对象。所以我回到Turkey.map@data &lt;- merge(Turkey.map@data,TRdata,by.x="Admin1Name",by.y="Province", all.x=TRUE, sort=FALSE) 我已经尝试过
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 2018-02-13
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2015-11-19
    • 2015-04-17
    相关资源
    最近更新 更多