Zeilen im Shapefile in R entfernen

12

Ich habe ein Shapefile in R importiert und es mit einer Tabelle verbunden. Mein Shapefile enthält alle Volkszählungs-IDs, während meine Tabelle nur ausgewählte Volkszählungs-IDs enthält. Ich versuche jetzt, alle Zeilen zu löschen, die nicht übereinstimmen.

So sieht mein Dataset aus (ich versuche, alle Zeilen mit NA zu entfernen, daher müssten die letzten beiden entfernt werden):

  CTUID   Cluster   Average
5350007.01  1       124.53
5350007.02  1       234.87
5350010.01  4       110.11
5350010.02  5       187.68
5350001     NA        NA
5350002     NA        NA

Ich habe versucht, diesen Code zu verwenden:

shape2[!(rowSums(is.na(shape2))==NCOL(shape2)),]

Welches gab mir diesen Fehler:

Error in rowSums(is.na(shape2)) : 
  'x' must be an array of at least two dimensions
In addition: Warning message:
In is.na(shape2) : is.na() applied to non-(list or vector) of type 'S4'

Ich bin nicht sehr kompetent in R, also wäre jede Hilfe sehr dankbar. Wenn Sie eine kurze Erklärung hinzufügen könnten, wäre das fantastisch.

Kelly
quelle

Antworten:

13

Der informative Teil des Fehlers besteht darin, dass die Daten, mit denen Sie arbeiten, ein S4-Klassenobjekt sind und als solches Slots enthalten. Dies bedeutet, dass Sie auf dem entsprechenden Steckplatz "@data" arbeiten müssen, der Ihren Datenrahmen enthält.

Wenn Sie "alle" Zeilen mit NA-Werten löschen möchten, können Sie einfach na.omit für den Dataframe-Slot verwenden. Dies dringt durch das sp-Objekt und entfernt zugehörige Punkte / Polygone in den anderen Slots.

shape@data <- na.omit(shape@data)

Wenn Sie Zeilen mit NAs in einer bestimmten Spalte entfernen möchten, können Sie Folgendes verwenden:

shape@data <- shape[!is.na(shape@data$col) ,]

**** Update 03/08/2016 Es gibt jetzt eine native Zusammenführungsfunktion, die sp-Objekte bearbeitet. Sie können merge genauso aufrufen, wie Sie es mit jedem anderen data.frame tun würden. Das Argument x ist jedoch ein sp-SpatailDataFrame-Klassenobjekt, und y ist ein beliebiger data.frame, den Sie zusammenführen möchten. Ich lasse die ursprüngliche Antwort zu Referenzzwecken.


Ich sollte auch darauf hinweisen, dass Sie die Zusammenführungsfunktion nicht zum Verknüpfen mit einem sp-Objekt verwenden können. Die Zusammenführungsfunktion setzt die Daten während des Vorgangs neu zusammen, wodurch die interne Beziehung im sp-Objekt unterbrochen wird. Dies ist etwas, das leider nicht weit verbreitet ist. Auf diese Weise können Sie einen Datenrahmen mit dem @ data-Slot eines sp-Objekts zusammenführen.

shape@data = data.frame(shape@data, OtherData[match(sdata@data$IDS, OtherData$IDS),])

Wo; shape ist Ihre Formdatei, IDS ist die Kennung, mit der Sie zusammenführen möchten, und OtherData ist der Datenrahmen, den Sie mit shape kombinieren möchten. Beachten Sie, dass IDS in den beiden Datensätzen unterschiedliche Namen haben können, aber tatsächlich dieselben Werte haben müssen (nicht unscharf).

Alternativ können Sie diese Funktion nutzen.

join.sp.df <- function(x, y, xcol, ycol) {
  x$sort_id <- 1:nrow(as(x, "data.frame"))  
    x.dat <- as(x, "data.frame")  
     x.dat2 <- merge(x.dat, y, by.x = xcol, by.y = ycol)  
    x.dat2.ord <- x.dat2[order(x.dat2$sort_id), ]  
  x2 <- x[x$sort_id %in% x.dat2$sort_id, ]  
  x2.dat <- as(x2, "data.frame") 
    row.names(x.dat2.ord) <- row.names(x2.dat)  
  x2@data <- x.dat2.ord  
  return(x2)
}

Wo; x = sp SpatialDataFrame-Objekt, y = DataFrame-Objekt, das mit x zusammengeführt werden soll, xcol = Spaltenname in sp-Objekt zusammenführen (muss in Anführungszeichen gesetzt werden), ycol = Spaltenname in DataFrame-Objekt zusammenführen (muss in Anführungszeichen gesetzt werden).

Aus irgendeinem Grund kann ich die @ Kelly-Frage nicht kommentieren, daher bearbeite ich meine ursprüngliche Antwort. Überprüfen Sie, welche Version von R und SP Sie ausführen? Sie können SessionInfo () ausführen, um dies herauszufinden. Das Verhalten des Entfernens zugeordneter Objekte in den anderen Datenbereichen beim Bearbeiten des @ data-Objekts war nur in den letzten sp-Versionen verfügbar. Wenn Sie keine aktuelle Version ausführen, aktualisieren Sie das Paket mit "Pakete aktualisieren" im Paketmenü. Wenn Sie> = Windows Vista ausführen, müssen Sie als Administrator ausgeführt werden. Sehen Sie sich auch die Maße vor und nach dem Objekt an, dh dim (Form), die die Anzahl der Zeilen / Spalten darstellt. Die Anzahl der Zeilen entspricht der Anzahl der Feature-Objekte. Sie können die Ergebnisse überprüfen, indem Sie überprüfen, ob die Anzahl der Zeilen im Geo-Objekt mit der Anzahl der Zeilen im @ data-Slot übereinstimmt, dh dim (shape).

Jeffrey Evans
quelle
Danke für Ihre Hilfe! Ich habe die räumliche Verknüpfung umgestaltet, weil ich "Zusammenführen" anstelle von "Übereinstimmen" verwendet habe. Ich habe alle NA-Zeilen entfernt, aber die Form ist beim Plotten im Shapefile noch vorhanden. Irgendwelche Gedanken darüber, warum das passiert?
Kelly
Eine Änderung dieser Antwort ist bei SP 1.0-15 erforderlich. Eine sp-spezifische Version der Zusammenführungsfunktion wird jetzt aufgerufen, wenn ein sp-Klassenobjekt übergeben wird, das korrekt ausgeführt wird, vorausgesetzt, Sie führen eine Eins-zu-Eins-Übereinstimmung durch, um die Zeilendimensionen mit den zugeordneten Slots konsistent zu halten.
Jeffrey Evans
7

Mit den Updates in den Paketen würde ich folgendes vorschlagen:

shape <- shape[!is.na(shape@data$col),]
WAF
quelle
In früheren Versionen hätte dies dazu geführt, dass "Form" zu einem data.frame gezwungen wurde. Es ist schön, dass die sp-Entwickler damit beginnen, einige der Standard-R-Methoden für sp-Objekte einzusetzen. Vielen Dank für die Bereitstellung dieses Updates.
Jeffrey Evans