我尝试将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
包进行合并,并且我同时收到同样的错误(即{{1} }})。我查看了Error: nrowBefore == nrowAfter is not TRUE
代码,看起来每个文件的行数应该匹配。但是,似乎通过sp::merge
调用,这不重要。以下是duplicateGeoms
对此的说法:
help
答案 0 :(得分:1)
最简单的方法是将您的数据(@data
文件)加入SpatialPolygonsDataFrame
对象中的SpatialPolygonsDataFrame
框架。问题是每个国家需要一行(这是df <- elephByCountry[, c("region", "subregionid", "country", "ISO2", "ISO3", "cap.lat", "cap.long")]
df <- unique(df)
对象的设置方式),但每个国家的数据分布在每个国家三行(每年一行)。
我建议最好的办法是将数据转换为与空间数据兼容的格式。我会通过制作数据框的副本和子集在所有年份保持不变的列(如国家名称,地区,纬度,经度等)来实现此目的:
reshape2
这为您提供了一些在准备好后可以合并回空间数据的东西。对于每个变化的剩余变量,我会使用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 =
为所需的变量完成此操作(根据需要替换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`)
从这里你可以绘制你的等值线图:
<Button Margin="0,7,12,0" HorizontalAlignment="Right" Height="20" Width="23">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="White"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="BorderThickness" Value="1"/>
</Trigger>
<Trigger Property="IsPressed" Value="False">
<Setter Property="BorderThickness" Value="0"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
<Image Grid.Column="0" Grid.Row="0" Margin="0,0,0,0" Height="20" Width="20" Source="/Images/Undo.png">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="0.7"/>
</Trigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Button>