将SpatialPolygonsDataFrame与数据集合并时的错误

时间:2016-07-30 17:23:47

标签: r merge sp

我尝试将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包进行合并,并且我同时收到同样的错误(即{{1} }})。我查看了Error: nrowBefore == nrowAfter is not TRUE代码,看起来每个文件的行数应该匹配。但是,似乎通过sp::merge调用,这不重要。以下是duplicateGeoms对此的说法:

help

1 个答案:

答案 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>
相关问题