Usuwanie wierszy z pliku kształtu w R

12

Zaimportowałem plik kształtu do R i dołączyłem go do tabeli. Mój plik kształtu zawiera wszystkie identyfikatory spisu, podczas gdy moja tabela zawiera tylko wybrane identyfikatory spisu. Próbuję teraz usunąć wszystkie wiersze nie pasują.

Tak wygląda mój zestaw danych (próbuję usunąć wszystkie wiersze za pomocą NA, więc dwa ostatnie trzeba będzie usunąć):

  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

Próbowałem użyć tego kodu linii:

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

Co dało mi ten błąd:

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'

Nie jestem zbyt biegły w języku R, więc każda pomoc byłaby naprawdę mile widziana. Jeśli możesz podać krótkie wyjaśnienie, które byłoby fantastyczne.

Kelly
źródło

Odpowiedzi:

13

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

Jeffrey Evans
źródło
Dzięki za pomoc! Zmieniłem połączenie przestrzenne, ponieważ użyłem „scalenia” zamiast „dopasowania”. Usunąłem wszystkie wiersze NA, ale kształt jest nadal obecny w pliku kształtu, kiedy go kreślę. Wszelkie przemyślenia na temat tego, dlaczego tak się dzieje?
Kelly,
Zmiana tej odpowiedzi jest konieczna w sp. 1.0-15. Wywoływana jest teraz specyficzna dla sp wersja funkcji scalania po przekazaniu obiektu klasy sp, który działa poprawnie, biorąc pod uwagę, że wykonano dopasowanie jeden do jednego, aby zachować wymiary wiersza zgodne z powiązanymi szczelinami.
Jeffrey Evans
7

Z aktualizacjami w pakietach sugerowałbym, co następuje:

shape <- shape[!is.na(shape@data$col),]
WAF
źródło
W poprzednich wersjach powodowało to, że „kształt” był zmuszany do przekształcenia w ramkę danych. Fajnie, że programiści sp zaczynają sprawiać, że niektóre standardowe metody R działają na obiektach sp. Dziękujemy za udostępnienie tej aktualizacji.
Jeffrey Evans