12 votos

Eliminación de filas en un shapefile en R

He importado un shapefile en R, y lo he unido a una tabla. Mi shapefile contiene todos los identificadores de censo, mientras que mi tabla sólo contiene los identificadores de censo seleccionados. Ahora estoy tratando de eliminar todas las filas no consiguió una coincidencia.

Este es el aspecto de mi conjunto de datos (estoy intentando eliminar todas las filas con NA, por lo que habría que 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 utilizar 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, así que cualquier ayuda sería muy apreciada. Si pudiera incluir una breve explicación que sería fantástico.

Gracias por su ayuda.

14voto

Dan Puntos 16

La parte informativa del error es que los datos sobre los que opera son un objeto de clase S4 y como tal contiene 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 NA, puede utilizar na.omit en la ranura del marco de datos. Esto 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 quieres eliminar las filas con NA's en una columna específica puedes utilizar:

shape@data <- shape[shape@data$col != NA ,]

También debo señalar que no se puede utilizar la función de fusión para unirse a un objeto sp. La función merge resorbe los datos durante la operación lo que rompe la relación interna en el objeto sp. Esto es algo que, desgraciadamente, no se anuncia mucho. Para fusionar un dataframe a la ranura @data de un objeto sp se puede utilizar match de esta manera.

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

Donde: shape es su archivo shape, IDS es el identificador que desea combinar y OtherData es el marco de datos que desea combinar con shape. Tenga en cuenta que los IDS pueden tener nombres diferentes en los dos conjuntos de datos, pero tienen que ser realmente los mismos valores (no difusos).

También puede utilizar 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)
}

Donde; x=objeto SpatialDataFrame, y=objeto dataframe a fusionar con x, xcol=nombre de la columna a fusionar en el objeto sp (debe citarse), ycol=nombre de la columna a fusionar en el objeto dataframe (debe citarse).

Por alguna razón no puedo comentar la pregunta de @Kelly así que edito mi respuesta original. Comprueba qué versión de R y sp estás ejecutando. Puedes ejecutar SessionInfo() para averiguarlo. El comportamiento de eliminar los objetos asociados en las otras ranuras de datos cuando se manipula el objeto @data sólo ha estado disponible en las últimas versiones de 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 ejecutar como administrador. También mire las dimensiones de su objeto antes y después, es decir, dim(shape), que representa el número de filas/cajas. El número de filas se corresponde con el número de objetos de características. Puede comprobar los resultados verificando si el número de filas en el objeto espacial coincide con el número de filas en la ranura @data, es decir, dim(shape); dim(shape@data)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X