Eliminar filas en shapefile en R

12

Importé un shapefile en R y lo uní a una tabla. Mi archivo de forma contiene todos los identificadores de censo, mientras que mi tabla solo contiene identificadores de censo seleccionados. Ahora estoy tratando de eliminar todas las filas no obtuvieron una coincidencia.

Así es como se ve mi conjunto de datos (estoy tratando de eliminar todas las filas con NA, por lo que sería necesario eliminar las dos últimas):

  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

He intentado usar este código de línea:

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

Lo que me dio este error:

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'

No soy muy competente en R, por lo que cualquier ayuda sería muy apreciada. Si pudiera incluir una breve explicación, sería fantástico.

Kelly
fuente

Respuestas:

13

La parte informativa del error es que los datos en los que está operando son un objeto de clase S4 y, como tal, contienen ranuras. Esto significa que debe operar en la ranura apropiada "@data" que contiene su marco de datos.

Si desea eliminar "todas" las filas con valores de NA, puede usar na.omit en la ranura del marco de datos. Esto se propaga a través del objeto sp y elimina los puntos / polígonos asociados en las otras ranuras.

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

Si desea eliminar filas con NA en una columna específica, puede usar:

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

**** Actualización 03/08/2016 Ahora hay una función de fusión nativa que opera en objetos sp. Puede llamar a fusionar de la misma manera que lo haría con cualquier otro data.frame. Sin embargo, el argumento x es un objeto de clase sp SpatailDataFrame e y es cualquier data.frame que desee fusionar. Estoy dejando la respuesta original para fines de referencia.


También debo señalar que no puede usar la función de fusión para unirse a un objeto sp. La función de fusión recurre a los datos durante la operación que rompe la relación interna en el objeto sp. Esto es algo que, desafortunadamente, no se publicita ampliamente. Para fusionar un marco de datos en la ranura @data de un objeto sp, puede usar la coincidencia de esta manera.

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

Dónde; shape es su archivo de forma, IDS es el identificador con el que desea fusionarse y OtherData es el marco de datos que desea combinar con shape. Tenga en cuenta que los IDS pueden ser nombres diferentes en los dos conjuntos de datos, pero en realidad deben ser los mismos valores (no difusos).

Alternativamente, puede usar esta función.

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

Dónde; x = sp Objeto SpatialDataFrame, y = objeto de marco de datos para combinar con x, xcol = Combinar nombre de columna en objeto sp (necesita comilla), ycol = Combinar nombre de columna en objeto de marco de datos (necesita comilla).

Por alguna razón, no puedo comentar sobre la pregunta de @Kelly, así que estoy editando mi respuesta original. Comprueba qué versión de R y sp estás ejecutando? Puede ejecutar SessionInfo () para averiguarlo. El comportamiento de eliminar objetos asociados en las otras ranuras de datos al manipular el objeto @data solo ha estado disponible en las últimas dos versiones sp. Si no está ejecutando una versión actual, intente actualizar el paquete con "Actualizar paquetes" en el menú de paquetes. Si ejecuta> = Windows Vista, asegúrese de ejecutarlo como administrador. Observe también las dimensiones del objeto antes y después, es decir, dim (forma), que representa el número de filas / columnas. El número de filas corresponde con el número de objetos de características. Puede verificar los resultados comprobando si el número de filas en el objeto espacial coincide con el número de filas en la ranura @data, es decir, tenue (forma);

Jeffrey Evans
fuente
¡Gracias por tu ayuda! Rehice la unión espacial porque utilicé una 'fusión' en lugar de una 'coincidencia'. Eliminé todas las filas de NA, pero la forma todavía está presente en el archivo de forma cuando la trazo. ¿Alguna idea de por qué está sucediendo esto?
Kelly
Es necesaria una enmienda a esta respuesta en la sp 1.0-15. Ahora se llama una versión específica de sp de la función de fusión, cuando se pasa un objeto de clase sp, que funciona correctamente dado que realiza una coincidencia uno a uno para mantener las dimensiones de fila consistentes con los espacios asociados.
Jeffrey Evans
7

Con las actualizaciones en los paquetes, sugeriría lo siguiente:

shape <- shape[!is.na(shape@data$col),]
WAF
fuente
En versiones anteriores, eso habría resultado en que la "forma" se convirtiera en un marco de datos. Es bueno que los desarrolladores de sp estén comenzando a hacer que algunos de los métodos R estándar funcionen en objetos sp. Gracias por proporcionar esta actualización.
Jeffrey Evans