Rimozione di righe nel file di forma in R


12

Ho importato un file di forma in R e l'ho unito a una tabella. Il mio shapefile contiene tutti gli ID di censimento, mentre la mia tabella contiene solo ID di censimento selezionati. Sto provando a eliminare tutte le righe non ho trovato una corrispondenza.

Ecco come appare il mio set di dati (sto cercando di rimuovere tutte le righe con NA, quindi è necessario rimuovere le ultime due):

  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

Ho provato a usare questo codice di linea:

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

Che mi ha dato questo errore:

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'

Non sono molto competente in R, quindi qualsiasi aiuto sarebbe molto apprezzato. Se potessi includere una breve spiegazione sarebbe fantastico.

Risposte:


13

La parte informativa dell'errore è che i dati su cui operi sono oggetti di classe S4 e come tali contengono slot. Ciò significa che è necessario operare nello slot appropriato "@data" contenente il proprio frame di dati.

Se si desidera eliminare "tutte" le righe con valori NA, è possibile utilizzare na.omit nello slot del frame di dati. Questo fa avanzare attraverso l'oggetto sp e rimuove i punti / poligoni associati negli altri slot.

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

Se vuoi rimuovere le righe con NA in una colonna specifica puoi usare:

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

**** Aggiornamento 03/08/2016 Esiste ora una funzione di unione nativa che opera su oggetti sp. Puoi chiamare l'unione come faresti con qualsiasi altro data.frame. Tuttavia l'argomento x è un oggetto classe sp SpatailDataFrame e y è qualsiasi data.frame che si desidera unire. Lascio la risposta originale a scopo di riferimento.


Vorrei anche sottolineare che non è possibile utilizzare la funzione di unione per unirsi a un oggetto sp. La funzione di unione ricorre ai dati durante l'operazione che interrompe la relazione interna nell'oggetto sp. Questo è qualcosa che, sfortunatamente, non è ampiamente pubblicizzato. Per unire un frame di dati allo slot @data di un oggetto sp è possibile utilizzare la corrispondenza in questo modo.

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

Dove; shape è il tuo file shape, IDS è l'identificatore su cui vuoi unirti e OtherData è il frame di dati che vuoi combinare con shape. Si noti che IDS può avere nomi diversi nei due set di dati, ma in realtà devono avere gli stessi valori (non fuzzy).

In alternativa è possibile utilizzare questa funzione.

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

Dove; x = sp Oggetto SpatialDataFrame, y = oggetto dataframe da unire con x, xcol = Unisci il nome della colonna nell'oggetto sp (è necessario citare), ycol = Unisci il nome della colonna nell'oggetto dataframe (è necessario citare).

Per qualche motivo non posso commentare la domanda di @Kelly, quindi sto modificando la mia risposta originale. Controlla quale versione di R e sp stai utilizzando? È possibile eseguire SessionInfo () per scoprirlo. Il comportamento di rimozione degli oggetti associati negli altri slot di dati durante la manipolazione dell'oggetto @data è stato disponibile solo nelle ultime due versioni di sp. Se non si esegue una versione corrente, provare ad aggiornare il pacchetto con "Aggiorna pacchetti" nel menu Pacchetti. Se in esecuzione> = Windows Vista, assicurati di eseguire come amministratore. Guarda anche le dimensioni dell'oggetto prima e dopo, ad esempio dim (forma), che rappresenta il numero di righe / colonne. Il numero di righe corrisponde al numero di oggetti funzione. Puoi controllare i risultati controllando se il numero di righe nell'oggetto spaziale corrisponde al numero di righe nello slot @data, ad esempio dim (forma);


Grazie per l'aiuto! Ho rifatto l'unione spaziale perché ho usato una "unione" anziché "corrispondenza". Ho rimosso tutte le righe NA, ma la forma è ancora presente nel file di forma quando la tracciamo. Qualche idea sul perché questo sta accadendo?
Kelly

È necessario un emendamento a questa risposta alla sp 1.0-15. Una versione specifica sp della funzione di unione viene ora chiamata, quando viene passato un oggetto classe sp, che esegue correttamente dato che si esegue una corrispondenza uno a uno per mantenere le dimensioni della riga coerenti con gli slot associati.
Jeffrey Evans,

7

Con gli aggiornamenti nei pacchetti suggerirei quanto segue:

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

Nelle versioni precedenti ciò avrebbe comportato la forzatura della "forma" in un data.frame. È bello che gli sviluppatori sp stiano iniziando a far funzionare alcuni dei metodi R standard su oggetti sp. Grazie per aver fornito questo aggiornamento.
Jeffrey Evans,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.