2010-09-06 11 views
31

Ich habe (wieder) ein Problem mit der Kombination von Datenrahmen in R. Aber dieses Mal ist man ein SpatialPolygonDataFrame (SPDF) und der andere ist üblich data.frame (DF). Die SPDF hat rund 1000 Zeilen die DF nur 400. Beide haben eine gemeinsame Spalte, QDGCWie fügt man einen einfachen data.frame an einen SpatialPolygonDataFrame in R an?

Jetzt habe ich versucht,

oo <- merge(SPDF,DF, by="QDGC", all=T) 

aber dies nur zu einer normalen data.frame, keine räumlichen Polygondatenrahmen nicht mehr. Ich las woanders, dass das nicht funktioniert, aber ich habe nicht verstanden, was in einem solchen Fall zu tun ist (muss etwas mit den ID-Spalten tun, Merge verwendet)

oooh so eine schwierige Frage, ich quess. ..

Danke! Jens

Antwort

40

Wir df = Datenrahmen, sp = räumliches Polygon-Objekt und durch = Name oder Spaltennummer der gemeinsamen Spalte. Sie können dann den Datenrahmen in das sp-Objekt unter Verwendung der folgenden Codezeile zusammenführen:

[email protected] = data.frame([email protected], df[match([email protected][,by], df[,by]),]) 

So funktioniert der Code. Die Übereinstimmungsfunktion innerhalb richtet die Spalten so aus, dass die Reihenfolge erhalten bleibt. Wenn wir es mit sp @ data zusammenführen, wird die Reihenfolge korrekt beibehalten. Eine schnelle Überprüfung, ob der Code funktioniert hat, besteht darin, die beiden Spalten zu prüfen, die der gemeinsamen Spalte entsprechen, und festzustellen, ob sie identisch sind (die üblichen Spalten werden dupliziert und die Kopie kann leicht entfernt werden, aber ich behalte sie wie a gute Kontrolle)

+1

Vielen Dank! Du hast meinen Abend gerettet! Und wahrscheinlich auch die ganze Woche! Es hat sehr gut funktioniert. – Jens

+0

@Ramnath Funktioniert diese Lösung, wenn der räumliche Datenrahmen mehr Zeilen (Polygone) als die zusammengeführten Daten enthält? Und auch im umgekehrten Fall - wenn es in verknüpften Daten mehr Beobachtungen gibt? – radek

+0

Wie wäre das anders, wenn beide Objekte 'SpatialP * DataFrame' sind? – gregmacfarlane

6

Zusammenführen kann einen Datenrahmen mit mehr Reihen als die Originale erzeugen, wenn es keine einfache 1-1-Zuordnung der beiden Datenrahmen gibt. In diesem Fall müsste es die gesamte Geometrie kopieren und mehrere Polygone erstellen, was wahrscheinlich keine gute Sache ist.

Wenn Sie ein Datenframe mit der gleichen Anzahl von Zeilen wie SpatialPointsDataFrame haben, können Sie den @data-Slot einfach direkt ersetzen.

library(sp) 
example(overlay) # to get the srdf object 
[email protected] 
spplot(srdf) 
[email protected]=data.frame(x=runif(3),xx=rep(0,3)) 
spplot(srdf) 

, wenn Sie die Anzahl der Zeilen falsch:

[email protected]=data.frame(x=runif(2),xx=rep(0,2)) 
spplot(srdf) 
Error in data.frame(..., check.names = FALSE) : 
    arguments imply differing number of rows: 3, 2 
+0

Okay, ich habe das follwing: (1) oo <- fusionieren (SPDF-, DF, durch = "QDGC" , alle = T) (2) SPDF @ Daten <- oo (3) Plot (SPDF) die Daten sind jetzt da, aber in sehr falscher Reihenfolge. vielleicht sollte ich etwas sortieren? – Jens

+0

autsch. Ich hätte das überprüfen sollen. – Spacedman

2

Vielleicht ist die Funktion joinCountryData2Map im rworldmap Paket kann Inspiration geben. (Aber ich könnte falsch liegen, wie ich das letzte Mal war.)

16

Es ist so einfach wie diese:

require(sp) # the trick is that this package must be loaded! 

oo <- merge(SPDF,DF, by="QDGC") 

ich habe von mir getestet. Aber es funktioniert nur, wenn Sie merge from package sp verwenden. Dies ist die Standardeinstellung, wenn das Paket sp geladen ist. merge Funktion ist dann überlastet und sp::merge wird verwendet, wenn das erste Argument räumliche Struktur ist.

+1

Das hat wirklich gut für mich funktioniert! Ich denke jedoch, es ist erwähnenswert, dass einige Probleme auftreten können, wenn der Datenrahmen und das SPDF nicht die gleiche Anzahl von Zeilen haben. Ich habe einen Fehler ("Anzahl der Objekte nicht übereinstimmend") erhalten, der von diesem Problem verursacht wurde. Schließlich konnte ich die Zusammenführung durchführen, indem ich "all.x = TRUE" (wobei x die SPDF ist) hinzufüge. –

0

Eine weitere Lösung ist append_data Funktion aus dem tmaptools Paket zu verwenden. Es ist mit diesen Argumenten aufgerufen:

append_data(shp, data, key.shp = NULL, key.data = NULL, 
    ignore.duplicates = FALSE, ignore.na = FALSE, 
    fixed.order = is.null(key.data) && is.null(key.shp)) 

Es ist ein bisschen schade, dass es append genannt, da ich mehr ina Gefühl der rbind hängen verstehen würde und wir wollen etwas wie join oder merge hier haben.

Ignorieren dieser Tatsache, Funktion ist wirklich nützlich, um sicherzustellen, dass Sie Ihre Joins korrekt und wenn einige Zeilen nur auf einer Seite der Verknüpfung vorhanden sind. Aus der Dokumentation:

Unter Abdeckung (Form Elemente, die Datensätze nicht entsprechen), über Berichterstattung (Datensätze, die nicht entsprechen Artikel formen respectively) sowie die Existenz von duplizierten Schlüsselwerten automatisch überprüft und über Konsolenmeldungen gemeldet. Mit under_coverage und over_coverage dem unter und über Abdeckung Schlüssel Werte des letzten append_data Anruf kann abgerufen werden,