Suppression de colonnes dans un SpatialPolygonsDataFrame dans R?

8

Mon bloc de données de polygone spatial (SPDF) contient trop de colonnes (variables) et je veux supprimer la plupart des colonnes entièrement.

Je sais comment faire cela avec une trame de données régulière dans R, mais je ne sais pas comment faire cela lorsque je traite un objet de classe SpatialPolygonsDataFrame?

user3915459
la source

Réponses:

14

Utilisez la syntaxe object_ name[,-(1:5)]pour supprimer les colonnes 1 à 5 ou object_name[,-c(1,5)]pour supprimer les colonnes 1 et 5. Voir l'exemple ci-dessous (avec commentaires):

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

Pour utiliser les noms des colonnes, vous pouvez implémenter ici la solution de Joris Meys , qui consiste à créer une liste de noms et à l'utiliser pour supprimer les colonnes.

Par exemple:

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

Voici une alternative en utilisant la fonction select du package dplyr:

library(dplyr)

SPDF@data <- SPDF@data %>% 
select(1, 3) #keeps column 1 and column 3 in the spdf object.
user3342735
la source
3
Cela me rend nerveux d'opérer sur la fente @data en utilisant des packages ou des fonctions non spécifiquement conçus pour les objets spatiaux. C'est pourquoi il existe une version spéciale de la fusion, la version de base de la fusion visse les noms des lignes et rompt les relations entre les attributs et les fonctionnalités.
Jeffrey Evans
0

La commande suivante fait également l'affaire, mais vous devez connaître les numéros de vos colonnes:

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