Informacyjna część błędu polega na tym, że dane, na których operujesz, to obiekt klasy S4 i jako taki zawierają szczeliny. Oznacza to, że musisz operować na odpowiednim gnieździe „@data” zawierającym ramkę danych.
Jeśli chcesz usunąć „wszystkie” wiersze z wartościami NA, możesz po prostu użyć na.omit w gnieździe ramki danych. Spowoduje to przejście przez obiekt sp i usunięcie powiązanych punktów / wielokątów w innych gniazdach.
shape@data <- na.omit(shape@data)
Jeśli chcesz usunąć wiersze z NA w określonej kolumnie, możesz użyć:
shape@data <- shape[!is.na(shape@data$col) ,]
**** Aktualizacja 03/08/2016 Dostępna jest natywna funkcja scalania, która działa na obiektach sp. Możesz wywołać scalanie w taki sam sposób, jak w przypadku innych danych data.frame. Jednak argument x jest obiektem klasy SpatailDataFrame, ay oznacza dowolną ramkę data.frame, którą chcesz scalić. Oryginalną odpowiedź pozostawiam w celach informacyjnych.
Powinienem również zauważyć, że nie można użyć funkcji scalania, aby połączyć się z obiektem sp. Funkcja scalania odwołuje dane podczas operacji, co przerywa wewnętrzną relację w obiekcie sp. To jest, niestety, mało reklamowane. Aby scalić ramkę danych ze szczeliną @data obiektu sp, możesz użyć dopasowania w ten sposób.
shape@data = data.frame(shape@data, OtherData[match(sdata@data$IDS, OtherData$IDS),])
Gdzie; shape to plik kształtu, IDS to identyfikator, który chcesz scalić, a OtherData to ramka danych, którą chcesz połączyć z kształtem. Zauważ, że IDS mogą mieć różne nazwy w dwóch zestawach danych, ale w rzeczywistości muszą mieć te same wartości (nie są rozmyte).
Alternatywnie możesz użyć tej funkcji.
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)
}
Gdzie; x = sp SpatialDataFrame obiekt, y = obiekt ramki danych do scalenia z x, xcol = Scal nazwę kolumny w obiekcie sp (trzeba zacytować), ycol = Scal nazwę kolumny w obiekcie ramki danych (należy zacytować).
Z jakiegoś powodu nie mogę komentować pytania @Kelly, dlatego edytuję swoją oryginalną odpowiedź. Sprawdź, którą wersję R i sp używasz? Możesz uruchomić SessionInfo (), aby się dowiedzieć. Zachowanie usuwania powiązanych obiektów w innych gniazdach danych podczas manipulowania obiektem @data było dostępne tylko w kilku ostatnich wersjach sp. Jeśli nie jest uruchomiona bieżąca wersja, spróbuj zaktualizować pakiet za pomocą „Aktualizuj pakiety” w menu pakietów. Jeśli działa> = Windows Vista, należy uruchomić jako administrator. Spójrz także na swoje wymiary przed i po obiektach, tj. Dim (kształt), który reprezentuje liczbę wierszy / kolumn. Liczba wierszy odpowiada liczbie obiektów obiektów. Możesz sprawdzić wyniki, sprawdzając, czy liczba wierszy w obiekcie przestrzennym odpowiada liczbie wierszy w gnieździe @data, tj. Dim (shape);