[R-sig-Geo] writing shapefiles / DBF files when input data contains NA

Dylan Beaudette dylan.beaudette at gmail.com
Tue Oct 7 06:21:43 CEST 2008


Hi,

I have noticed that saving data to files that include a DBF, result in
bogus data where there were NA. Using the write.dbf() function from
the foreign package seems to work a little better, but I still get odd
results in numeric columns. Writing to GRASS with the methods in the
spgrass6 package results in some thing that looks like this:

### code snippet:
writeVECT6(SDF=spatial.data, vname='pedons_grouped')


### errors:
Projection of input dataset and current location appear to match
Layer: pedons_g
WARNING: Column name changed: 'describer.' -> 'describer_'
WARNING: Column name changed: 'cat' -> 'cat_'
Importing map 103 features...
DBMI-DBF driver error:
SQL parser error: @@rror, unexpected NAME processing 'nan'
in statement:
insert into pedons_grouped values ( 1, 'd2g1', 'alex',
32.311427999999999,      252.434875000000005,     7227.804688000000169,
-0.000162000000000,           3,                      nan, 'NA',
-2147483648, 'NA', 'NA', -2147483648, -2147483648, 'NA',
nan, '1', 'NA' )
Error in db_execute_immediate()

ERROR: Cannot insert new row: insert into pedons_grouped values ( 1,
       'd2g1', 'alex', 32.311427999999999, 252.434875000000005,
       7227.804688000000169, -0.000162000000000, 3, nan, 'NA',
-2147483648,
       'NA', 'NA', -2147483648, -2147483648, 'NA', nan, '1', 'NA' )


### another self-contained example:


# load libs
library(sp)
library(rgdal)
library(foreign)

# read in xy data and promote to sp object
e <- read.csv(url('http://casoilresource.lawr.ucdavis.edu/drupal/files/elev.csv_.txt'))
coordinates(e) <- ~ x+y

# add a factor column
e at data$f <- factor(rep(letters[1:10], each=30))

# add some NA
e at data$elev[288:300] <- NA
e at data$f[288:300] <- NA

# save sp object to shapefile
writeOGR(e, driver='ESRI Shapefile', dsn='.', layer='pts')


# the results from dumping the DBF:
[...]
285,1543,j
286,1518,j
287,1656,j
288,-2147483648,NA
289,-2147483648,NA
[...]


# one more try with the foreign package's write.dbf()
write.dbf(e at data, file='second_try.dbf')

# results: look better, although the '******' isn't a legal int!
[...]
285,1543,j
286,1518,j
287,1656,j
288,*******,
289,*******,
[...]


Any ideas on how to work with missing data in numeric columns, when
the dreaded DBF file is involved??? This is a real show-stopper when
sending vector data back to GRASS, as it seems to rely on intermediate
files. Maybe it would be a good idea to send  the geometry first, and
then the attribute data. There would still be a problem if the DBF
back-end is in use...

Cheers,

Dylan




More information about the R-sig-Geo mailing list