title: Manipulate shapefile attribute table using R
body: <p>I've posted this <a href="https://gis.stackexchange.com/questions/64174/how-to-add-a-field-to-a-shapefile-using-r">question on the GIS stack exchange</a>, but it's not seeing much traffic.</p>
  
  <p>I'm a GIS user who's been using R for stats for a few years, and I'm excited to see a lot of new GIS capabilities being released (raster, shapefiles, rgdal, etc).</p>
  
  <p>I've done a lot of database and table manipulation in R, so being able to add and remove attributes from shapefiles is a powerful potential. </p>
  
  <p>I'm hoping I'm just missing what's out there, but I can't seem to find a good method for adding or removing attributes from a shapefile attribute table.</p>
  
  <p>Can anyone from Overflow respond to my GIS post? Or can I be advised how to get my list attribute table into a dataframe and back to replace the current attribute table?</p>
  
  <h2>Edit progress</h2>
  
  <p>Some progress since my original post:</p>
  
  <p>This is getting at figuring out how to take my attribute table appart (.dbf), add stuff, and now I'm trying to put it back together to replace the original dbf.</p>
  
  <pre><code>&gt;libary(raster); library(rgdal); library(shapefiles)
  &gt;shp&lt;-shapefile(Shape)  # D.C. area airport polygons
  &gt;summary(shp)           #Shapefile properties
  
  Object of class SpatialPointsDataFrame
  Coordinates:
                  min       max
  coords.x1  281314.2  337904.7
  coords.x2 4288867.0 4313507.0
  Is projected: TRUE 
  proj4string :
  [+proj=utm +zone=18 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
  Number of points: 4
  Data attributes:
      ObjectID        LOCID               NAME              FIELD              STATE            STATE_FIPS           ACAIS              TOT_ENP            TYPE          
   Min.   :134.0   Length:4           Length:4           Length:4           Length:4           Length:4           Length:4           Min.   :    271   Length:4          
   1st Qu.:242.8   Class :character   Class :character   Class :character   Class :character   Class :character   Class :character   1st Qu.:   3876   Class :character  
   Median :339.0   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Median :3409113   Mode  :character  
   Mean   :310.0                                                                                                                     Mean   :3717251                     
   3rd Qu.:406.2                                                                                                                     3rd Qu.:7122488                     
   Max.   :428.0
  
   &gt;shp.AT&lt;-read.dbf(gsub(".shp", ".dbf", Shape), header=TRUE)    #Read in the attribute table from the .dbf
   &gt; shp.AT       # First object in the dbf looks like an attribute table!
  $dbf
    ObjectID LOCID                            NAME               FIELD    STATE STATE_FIPS ACAIS TOT_ENP          TYPE
  1      134   ADW                     Andrews AFB                &lt;NA&gt; Maryland         24     Y    5078      Military
  2      279   DCA             Washington National                &lt;NA&gt; Virginia         51     Y 6813148          &lt;NA&gt;
  3      399   HEF               Manassas Regional Harry P Davis Field Virginia         51     Y     271      Regional
  4      428   IAD Washington Dulles International                &lt;NA&gt; Virginia         51     Y 8050506 International
  
  $header
  $header$file.version
  [1] 3
  
  $header$file.year
  [1] 113
  
  $header$file.month
  [1] 4
  
  $header$file.day
  [1] 12
  
  $header$num.records
  [1] 4
  
  $header$header.length
  [1] 321
  
  $header$record.length
  [1] 148
  
  $header$fields
          NAME TYPE LENGTH DECIMAL
  1   ObjectID    N     10       0
  2      LOCID    C      5       0
  3       NAME    C     45       0
  4      FIELD    C     30       0
  5      STATE    C     24       0
  6 STATE_FIPS    C      2       0
  7      ACAIS    C      1       0
  8    TOT_ENP    N     11       0
  9       TYPE    C     20       0
  
  &gt;shp.tab&lt;-as.data.frame(shp.AT[1]) # Grab the first object of the .dbf as a data.frame
  
  &gt; shp.tab       # First list object
    dbf.ObjectID dbf.LOCID                        dbf.NAME           dbf.FIELD dbf.STATE dbf.STATE_FIPS dbf.ACAIS dbf.TOT_ENP      dbf.TYPE
  1          134       ADW                     Andrews AFB                &lt;NA&gt;  Maryland             24         Y        5078      Military
  2          279       DCA             Washington National                &lt;NA&gt;  Virginia             51         Y     6813148          &lt;NA&gt;
  3          399       HEF               Manassas Regional Harry P Davis Field  Virginia             51         Y         271      Regional
  4          428       IAD Washington Dulles International                &lt;NA&gt;  Virginia             51         Y     8050506 International 
  
  &gt; shp.tab$NewAT&lt;-1:nrow(shp.tab) # Add my new attribute
  
  &gt; shp.tab # Added my new attribute, now to get this back into my shapefile
    dbf.ObjectID dbf.LOCID                        dbf.NAME           dbf.FIELD dbf.STATE dbf.STATE_FIPS dbf.ACAIS dbf.TOT_ENP      dbf.TYPE NewAT
  1          134       ADW                     Andrews AFB                &lt;NA&gt;  Maryland             24         Y        5078      Military     1
  2          279       DCA             Washington National                &lt;NA&gt;  Virginia             51         Y     6813148          &lt;NA&gt;     2
  3          399       HEF               Manassas Regional Harry P Davis Field  Virginia             51         Y         271      Regional     3
  4          428       IAD Washington Dulles International                &lt;NA&gt;  Virginia             51         Y     8050506 International     4
  
  &gt;write.dbf(shp.tab, gsub(".shp", ".dbf", Shape)) # Knew this wouldn't work, but demonstrate attempt to write this object as .dbf.
  ERROR:
  invalid subscript type 'list'
  
  &gt; shp.AT[1]&lt;-shp.tab # Try replacing the old Object[1] with my new table containing the new attribute.
  
  &gt; shp.AT # The table portion fo the shp.AT is gone. No attributes.
  $dbf
  [1] 134 279 399 428
  
  $header
  $header$file.version
  [1] 3
  
  $header$file.year
  [1] 113
  
  $header$file.month
  [1] 4
  
  $header$file.day
  [1] 12
  
  $header$num.records
  [1] 4
  
  &gt;write.dbf(shp.AT, gsub(".shp", ".dbf", Shape)) # If I go ahead and overwrite anyway...
  </code></pre>
  
  <p>My attributes are gone and replaced with an attribute table that contains a single field "dataframe".
  I recurse the script to again read the attribute table.</p>
  
  <pre><code>&gt; shp.tab
    dataframe
  1       134
  2       279
  3       399
  4       428
  </code></pre>
  
  <p>So, I think I'm close. Can anyone help me get this back into the shapefile attribute table?
  Or, is there a way better method?</p>
  
  <p>Thanks</p>