将 SpatialPolygonsDataFrame 与数据集合并时出错
Errors when merging SpatialPolygonsDataFrame with dataset
我正在尝试将 SpatialPolygonsDataFrame 与我的数据合并。我有一个要匹配的匹配变量。 data.frame 是纵向的,因此每个 ISO 有三个条目(即,南非 (ISO:ZAF) 有 2002、2007 和 2013 年的行)。我已经尝试使用 taRifx.geo
和 sp
,但都抛出错误。
这是 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
参数。它要求 SPDF
和 df
。就是这样。
这里是 sp
尝试的代码和错误。这里的文档更好,但我无法在任何地方找到错误的解释。
elephCountries <- sp::merge(x=afCountries, y=elephMapData, by="ISO_A3", duplicateGeoms=TRUE)
Error: nrowBefore == nrowAfter is not TRUE
我找遍了这意味着什么,但无法弄明白。老实说,我不关心我使用哪个包来合并这两个数据集,我只希望它能工作。任何帮助,将不胜感激。谢谢!
编辑:这是我要合并的文件。
我只对非洲国家进行子集化,因为这是一个关于非法捕杀大象的项目。所以这是代码:
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")
然后您可以使用 merge
或 dplyr::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`)
我正在尝试将 SpatialPolygonsDataFrame 与我的数据合并。我有一个要匹配的匹配变量。 data.frame 是纵向的,因此每个 ISO 有三个条目(即,南非 (ISO:ZAF) 有 2002、2007 和 2013 年的行)。我已经尝试使用 taRifx.geo
和 sp
,但都抛出错误。
这是 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
参数。它要求 SPDF
和 df
。就是这样。
这里是 sp
尝试的代码和错误。这里的文档更好,但我无法在任何地方找到错误的解释。
elephCountries <- sp::merge(x=afCountries, y=elephMapData, by="ISO_A3", duplicateGeoms=TRUE)
Error: nrowBefore == nrowAfter is not TRUE
我找遍了这意味着什么,但无法弄明白。老实说,我不关心我使用哪个包来合并这两个数据集,我只希望它能工作。任何帮助,将不胜感激。谢谢!
编辑:这是我要合并的文件。
我只对非洲国家进行子集化,因为这是一个关于非法捕杀大象的项目。所以这是代码:
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")
然后您可以使用 merge
或 dplyr::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`)