2016-07-30 11 views
0

Ich versuche, einen SpatialPolygonsDataFrame mit meinen Daten zusammenzuführen. Ich habe eine passende Variable, auf die ich mich einstellen möchte. Der data.frame ist longitudinal, also gibt es drei Einträge für jede ISO (d. H. Südafrika (ISO: ZAF) hat Zeilen für 2002, 2007 und 2013). Ich habe es versucht mit taRifx.geo und sp, aber beide werfen Fehler.Fehler beim Zusammenführen von SpatialPolygonsDataFrame mit Dataset

Hier ist der Code und der Fehler für die taRifx.geo Versuch. Ich bin mir überhaupt nicht sicher, dass das richtig ist, weil die merge Dokumentation für dieses Paket schrecklich ist.

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

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

Die Verwirrung mit dem obigen Fehler ist, dass nirgendwo in der merge Dokumentation es für ein x Argument nicht fragen. Es fragt nach SPDF und df. Das ist es.

Und hier ist der Code und Fehler für die sp Versuch. Die Dokumentation hier ist besser, aber ich konnte nirgendwo eine Erklärung für den Fehler finden.

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

Error: nrowBefore == nrowAfter is not TRUE 

Ich habe überall gesucht, was das bedeutet, und bin nicht in der Lage, es herauszufinden. Es ist mir ehrlich gesagt egal, welches Paket ich verwende, um die beiden Datensätze zusammenzuführen, ich will nur, dass es funktioniert. Jede Hilfe wäre willkommen. Vielen Dank!

EDIT: Hier sind die Dateien, die ich zusammenführen möchte.

The data file is here.

The map JSON file is here.

Ich bin subsetting nur afrikanische Länder, da dies ein Projekt über die illegale Tötung von Elefanten ist. So, hier ist der Code:

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) 

Wie ich bereits sagte, ich habe versucht, mit Zusammenführung sowohl in der sp Paket und dem taRifx.geo Paket und ich bekomme den gleichen Fehler mit beiden (das heißt Error: nrowBefore == nrowAfter is not TRUE). Ich habe den sp::merge Code angeschaut und es sieht so aus, als ob die Anzahl der Zeilen für jede Datei übereinstimmen sollte. Es scheint jedoch, dass mit dem duplicateGeoms Anruf, sollte das keine Rolle spielen. Hier ist, was die help sagt darüber:

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

Was genau wollen Sie tun? Versuchen Sie, Ihren Polygonen Attributdaten hinzuzufügen? Oder versuchen Sie einfach, mehr Polygone hinzuzufügen? Die Verwendung von 'merge' mit räumlichen Daten ist wahrscheinlich keine gute Idee. Sie sollten eine Funktion aus einem tatsächlichen räumlichen Paket verwenden, wie RGEOS, Raster, SP, SPATSTAT, MAPTools. – Tbar

+0

Können Sie Ihren Shapefile und Ihre Daten posten? Es ist einfacher, die Zusammenführung mit tatsächlichen Daten zu demonstrieren. – Phil

+0

. @ Tbar, danke, und ja, ich versuche, Attributdaten hinzuzufügen, so dass ich die Daten und Karten mit 'leaflet' verwenden kann. Außerdem verwende ich die Merge-Funktionen in räumlichen Paketen, wie Sie aus meinem Code sehen können, d. H. "Sp :: merge (...)". Und @Phil, ich habe Links zu meinen Daten und GEOJSON-Dateien auf Github gepostet. – ldlpdx

Antwort

1

Der einfachste Weg dies zu tun ist, Ihre Daten kommen (die .xlsx Datei) an den @data Rahmen in dem SpatialPolygonsDataFrame Objekt. Das Problem ist, dass eine Zeile pro Land erwartet wird (so ist das SpatialPolygonsDataFrame Objekt eingerichtet), aber die Daten für jedes Land sind auf drei Zeilen pro Land verteilt (eine für jedes Jahr).

Ich würde vorschlagen, das beste Ding zu tun ist, die Daten in ein Format zu mungern, das mit den räumlichen Daten kompatibel ist. Ich würde diesen Ansatz, indem eine Kopie des Datenrahmens zu machen und Spalten subsetting, die sich über alle Jahre konstant sind (wie der Name des Landes, der Region, Breite, Länge, etc.):

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

Dies gibt Ihnen etwas, das Sie Sobald Sie fertig sind, fügen Sie die räumlichen Daten zurück. Für jede der verbleibenden Variablen, die variieren, würde ich das reshape2-Paket verwenden, um die Daten in eine aufgeräumte Form zu "werfen".Mit Diff.from.expected als Beispiel:

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") 

Sie können dann mit merge oder dplyr::join() diese in die räumlichen Daten zusammenführen. Mit merge() als Beispiel:

[email protected] <- merge([email protected], dfe, by.x = "ISO_A3", by.y = "ISO3") 

Sobald Sie dies für die Variablen getan haben Sie brauchen (value.var = nach Bedarf ersetzen) und diese in die räumlichen Daten zusammengeführt, können Sie die ‚Konstanten‘ zurück in fusionieren:

[email protected] <- merge([email protected], df, by.x = "ISO_A3", by.y = "ISO3") 

Von hier aus können Sie Ihre Choroplethenkarte Grundstück:

library("maptools") # needed for plot methods 
plot(countries, asp = 1, col = [email protected]$`2007_diff.from.expected`) 
+0

. @ Phil Vielen Dank so! Das macht Sinn. – ldlpdx

Verwandte Themen