[R] map data.frame() data after having linked them to a read.shape() object

Tord Snäll Tord.Snall at nvb.slu.se
Wed Jan 10 17:49:56 CET 2007


Dear all,
I try to first link data in a data.frame() to a (polygon) read.shape() 
object and then to plot a polygon map showing the data in the 
data.frame. The first linking is called "link" in ArcView and "relate" 
in ArcMap. I use the code shown below, though without success.

Help with this would be greatly appreciated.

Thanks!

Tord

require(maptools)
# Read shape file (one row per county)
a=read.shape("myshp.shp", dbf.data=TRUE, verbose=TRUE)
str(a)
  ..- attr(*, "maxbb")= num [1:4] -100   49    0    0
  ..- attr(*, "class")= chr "ShapeList"
$ att.data:'data.frame':       490 obs. of  60 variables:
  ..$ STATE_FIPS: Factor w/ 12 levels "04","06","08",..: 11 11 11 11 4 5
5 5 5 5 ...
[snip]
  ..$ STACOUNT4 : Factor w/ 489 levels "ArizonaApache",..: 437 460 451
453 147 207 195 198 231 206 ...
  ..- attr(*, "data_types")= chr [1:60] "C" "C" "C" "C" ...
- attr(*, "class")= chr "Map"


# Read case data (one row per case)
cases = read.table("cases.txt", h=T,)
str(cases)
'data.frame':   431 obs. of  8 variables:
$ Year    : int  1950 1950 1950 1951 1956 1957 1959 1959 1959 1959 ...
$ Case    : int  3 1 2 1 1 1 2 4 1 3 ...
$ stacount: Factor w/ 106 levels "ArizonaApache",..: 1 66 76 66 26 29
15 25 30 60 ...

# table the cases data PER Year, PER County (County = "stacount")
temp = t(table(cases[,c("Year","stacount")]))
stacount = dimnames(temp)$stacount
temp = cbind(stacount, as.data.frame(temp[,1:ncol(temp)],row.names=F))
str(temp)
'data.frame':   106 obs. of  50 variables:
$ stacount: Factor w/ 106 levels "ArizonaApache",..: 1 2 3 4 5 6 7 8 9
10 ...
$ 1950    : int  1 0 0 0 0 0 0 0 0 0 ...
[snip]
$ 2005    : int  0 0 0 0 0 0 0 0 0 0 ...

# Pick out a temporary attribute data.frame
datfr = a$att.data

# Merge the temporaty data frame with tabled "cases"
for(i in 2:ncol(temp)){
     datfr = merge(datfr, temp[,c(1,i)], by.x="STACOUNT4",
by.y="stacount", all.x=T, all.y=F)
}

#Replace NAs with 0:
for(i in 61:109){
     datfr[,i] = ifelse(is.na(datfr[,i])==T,0,datfr[,i])
}

str(a$att.data)
'data.frame':   490 obs. of  60 variables:
$ NAME      : Factor w/ 416 levels "Ada","Adams",..: 120 352 265 277 33
210 122 135 372 209 ...
[snip]
$ STACOUNT4 : Factor w/ 489 levels "ArizonaApache",..: 437 460 451 453
147 207 195 198 231 206 ...
- attr(*, "data_types")= chr  "C" "C" "C" "C" ...
# Note that the above data is of "attribute type"

str(datfr)
'data.frame':   490 obs. of  109 variables:
$ STACOUNT4 : Factor w/ 489 levels "ArizonaApache",..: 1 2 3 4 5 6 7 8
9 10 ...
[snip]
$ 1951      : num  0 0 0 0 0 0 0 0 0 0 ...
[snip]
$ 2005      : num  0 0 0 0 0 0 0 0 0 0 ...
# Note that at the end of this, data type is not described - it is a 
"simple" data frame

# bind data together:
#Alternative 1:
a$att.data = cbind(a$att.data, datfr[,61:109])
# Other alternatives:
test = matrix(ncol=49)
a$att.data[,61:109] = test
a$att.data[,61:109] = datfr[,61:109]

# plot:
plot(a, auxvar=a$att.data[,61], xlim=c(-125,-99),ylim=c(28,52), xlab="",
ylab="", frame.plot=F,axes=F)
There were 50 or more warnings (use warnings() to see the first 50)
warnings()
49: "axes" is not a graphical parameter in: polygon(xy$x, xy$y, 
col,border, lty, ...)
50: "frame.plot" is not a graphical parameter in: polygon(xy$x, 
xy$y,col, border, lty, ...)

# The a$att.data type has changed to becoming a typical data.frame - 
"attr" is not mentioned:
str(a$att.data)
[snip]
$ 2003      : num  0 0 0 0 0 0 0 0 0 0 ...
$ 2004      : num  0 0 0 0 0 0 0 0 0 0 ...
$ 2005      : num  0 0 0 0 0 0 0 0 0 0 ...



-- 

Tord Snäll
Department of Conservation Biology
Swedish University of Agricultural Sciences (SLU)
P.O. 7002, SE-750 07 Uppsala, Sweden
Office/Mobile/Fax
+46-18-672612/+46-730-891356/+46-18-673537
E-mail: tord.snall at nvb.slu.se
www.nvb.slu.se/staff_tordsnall



More information about the R-help mailing list