Eliminar columnas en un SpatialPolygonsDataFrame en R?

8

Mi marco de datos de polígono espacial (SPDF) contiene demasiadas columnas (variables) y quiero eliminar la mayoría de las columnas por completo.

Sé cómo hacer esto con un marco de datos regular en R, pero no estoy seguro de cómo hacerlo cuando se trata de objetos de clase SpatialPolygonsDataFrame?

usuario3915459
fuente

Respuestas:

14

Use la sintaxis object_ name[,-(1:5)]para eliminar las columnas 1 a 5 o object_name[,-c(1,5)]para soltar las columnas 1 y 5. Vea el siguiente ejemplo (con comentarios):

require(maptools)

#load shapefile from maptools package to make a reproducible example.
xx <- readShapeSpatial(system.file("shapes/sids.shp", package="maptools")[1],
                   IDvar="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66"))

class(xx) #check the object class
#[1] "SpatialPolygonsDataFrame"
#attr(,"package")
#[1] "sp"

head(xx@data,3) #print first three rows from the slot 'data'

       AREA PERIMETER CNTY_ CNTY_ID      NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
      0.111     1.392  1904    1904  Alamance 37001  37001        1  4672    13
      0.066     1.070  1950    1950 Alexander 37003  37003        2  1333     0
      0.061     1.231  1827    1827 Alleghany 37005  37005        3   487     0

      NWBIR74 BIR79 SID79 NWBIR79
         1243  5767    11    1397
          128  1683     2     150
           10   542     3      12

xxx <- xx[,-(1:5)] #remove columns 1 to 5

head(xxx@data,3) #print the subsetted data frame

     FIPS FIPSNO CRESS_ID BIR74 SID74 NWBIR74 BIR79 SID79 NWBIR79
     37001  37001        1  4672    13    1243  5767    11    1397
     37003  37003        2  1333     0     128  1683     2     150
     37005  37005        3   487     0      10   542     3      12

Para usar los nombres de las columnas, puede implementar la solución de Joris Meys aquí , que consiste en crear una lista de nombres y usarla para soltar las columnas.

Por ejemplo:

drops <- c("AREA","PERIMETER") # list of col names
xxx <- xx[,!(names(xx) %in% drops)] #remove columns "AREA" and "PERIMETER"
Andre Silva
fuente
1

Aquí hay una alternativa usando la función select del paquete dplyr:

library(dplyr)

SPDF@data <- SPDF@data %>% 
select(1, 3) #keeps column 1 and column 3 in the spdf object.
usuario3342735
fuente
3
Me hace ver obvio operar en la ranura @data usando paquetes o funciones no diseñadas específicamente para objetos espaciales. Es por eso que hay una versión especial de fusión. La versión base de fusión arruina los nombres de las filas y rompe las relaciones entre los atributos y las características.
Jeffrey Evans el
0

El siguiente comando también hace el truco, pero debes conocer los números de columna:

temp<-df[c(1:6,99:103)]
Ben
fuente