将 SpatialPolygonsDataFrame 与数据集合并时出错

Errors when merging SpatialPolygonsDataFrame with dataset

我正在尝试将 SpatialPolygonsDataFrame 与我的数据合并。我有一个要匹配的匹配变量。 data.frame 是纵向的,因此每个 ISO 有三个条目(即,南非 (ISO:ZAF) 有 2002、2007 和 2013 年的行)。我已经尝试使用 taRifx.geosp,但都抛出错误。

这是 taRifx.geo 尝试的代码和错误。我完全不确定这是对的,因为这个包的 merge 文档很糟糕。

elephCountries <- taRifx.geo::merge(SPDF=afCountries, df=elephMapData, by=ISO_A3)

Error in as.data.frame(x) : argument "x" is missing, with no default

与上述错误混淆的是 merge 文档中没有任何地方要求 x 参数。它要求 SPDFdf。就是这样。

这里是 sp 尝试的代码和错误。这里的文档更好,但我无法在任何地方找到错误的解释。

elephCountries <- sp::merge(x=afCountries, y=elephMapData, by="ISO_A3", duplicateGeoms=TRUE)

Error: nrowBefore == nrowAfter is not TRUE

我找遍了这意味着什么,但无法弄明白。老实说,我不关心我使用哪个包来合并这两个数据集,我只希望它能工作。任何帮助,将不胜感激。谢谢!

编辑:这是我要合并的文件。

The data file is here.

The map JSON file is here.

我只对非洲国家进行子集化,因为这是一个关于非法捕杀大象的项目。所以这是代码:

countries <- readOGR("Data/geo-countries-master/data/countries.geojson", "OGRGeoJSON")

afCountries <- subset(countries, countries$ISO_A3 %in% c(
"AGO", "BDA", "BEN","BWA","BFA","CMR","CAF","TCD","COG","CIV","COD", "COM",
"DJA", "DZA", "EGY", "ERI", "ETH", "GAB", "GHA", "GIN", "GMB", "GNB", "GNQ", "KEN", 
"LSO", "LBR", "LBY", "MDG", "MRT", "MUS", "MAR", "MWI", "MLI", "SDN", "SSD",
"MOZ", "NAM", "NER", "NGA", "RWA", "SEN", "SHN", "SLE", "STP", "SOM", "SWZ", "ZAF", "TZA",
"TGO", "TUN", "UGA", "ZAF", "ZMB", "ZWE"))

elephMapData <- read.xlsx("Data/elephByCountry_master.xlsx", sheetName = "Sheet1")

elephCountries <- sp::merge(afCountries, elephMapData, by.x='ISO_A3', by.y='ISO3', duplicateGeoms=TRUE)

正如我上面所说,我已经尝试合并 sp 包和 taRifx.geo 包,但我在两者上都遇到了相同的错误(即 Error: nrowBefore == nrowAfter is not TRUE ).我查看了 sp::merge 代码,它看起来好像每个文件的行数都应该匹配。但是,对于 duplicateGeoms 调用,这似乎无关紧要。以下是 help 对此的说法:

duplicateGeoms  
logical; if TRUE geometries in x are duplicated if there are multiple matches between records in x and y

最简单的方法是将您的数据(.xlsx 文件)加入 SpatialPolygonsDataFrame 对象中的 @data 框架。问题是这需要每个国家一行(这是 SpatialPolygonsDataFrame 对象的设置方式),但每个国家/地区的数据分布在每个国家/地区的三行中(每年一行)。

我建议最好的办法是将数据转换为与空间数据兼容的格式。我会通过制作数据框的副本和子集列来解决这个问题,这些列在所有年份都是不变的(比如国家名称、地区、纬度、经度等):

df <- elephByCountry[, c("region", "subregionid", "country", "ISO2", "ISO3", "cap.lat", "cap.long")]
df <- unique(df)

这为您提供了一些您可以在准备就绪后合并回空间数据的内容。对于每个不同的剩余变量,我将使用 reshape2 包将数据 'cast' 整理成整洁的形式。以Diff.from.expected为例:

library("reshape2")
dfe <- dcast(elephByCountry, ISO3 ~ year, value.var = "Diff.from.expected")
colnames(dfe) <- c("ISO3", "2002_diff.from.expected", "2007_diff.from.expected", "2013_diff.from.expected")

然后您可以使用 mergedplyr::join() 将它们合并到空间数据中。以merge()为例:

countries@data <- merge(countries@data, dfe, by.x = "ISO_A3", by.y = "ISO3")

一旦你完成了你需要的变量(根据需要替换 value.var =)并将它们合并到空间数据中,你可以将 'constants' 合并回:

countries@data <- merge(countries@data, df, by.x = "ISO_A3", by.y = "ISO3")

从这里您可以绘制等值线图:

library("maptools")  # needed for plot methods
plot(countries, asp = 1, col = countries@data$`2007_diff.from.expected`)