[R-sig-Geo] merging a data.frame with a map

Michael Friendly friendly at yorku.ca
Wed Aug 20 21:24:06 CEST 2008


This may be a simple question, but I'm a newbie with the maptools and sp 
packages.
I have a set of shapefiles for Ontario "Forward sortation areas", the 
first 3 characters
of the postal code (FSA), that I can subset to give a map of Toronto. 
[My cudos to
the team that put maptools and sp together! This part is a lot more 
straight-forward
than when I last looked.]

I have other data attributes
for these areas in a separate file, that I'd like to display on the map, 
but I don't know
how to merge this with the map object.  I'm not sure if this matters, 
but to display the
map in Toronto-centric terms, I also have to rotate it slightly so that 
the conventional
northern boundary line is horizontal. I used elide() for this, all I 
could find in the help/examples
for rotation.
In the end, I'd like to write out a new shapefile
containing the rotated coordinates together with the data attributes 
from my data file.
I show the steps I've done so far below.

# using readShapeSpatial

 > ontario 
<-readShapeSpatial("ForwardSortationAreas_JUL07_ON_region.shp", 
IDvar="FSA", proj4string=CRS("+proj=longlat +datum=NAD83") )
 > toronto <- ontario[ontario$F=="M",]
 > summary(toronto)
Object of class SpatialPolygonsDataFrame
Coordinates:
   min max
r1 -80 -79
r2  44  44
Is projected: FALSE
proj4string : [+proj=longlat +datum=NAD83]
Data attributes:
      FSA            FSA_NAME  F        PR    
 M1B    : 1   TORONTO    :48   K:  0   35:102 
 M1C    : 1   NORTH YORK :22   L:  0          
 M1E    : 1   SCARBOROUGH:17   M:102          
 M1G    : 1   ETOBICOKE  :12   N:  0          
 M1H    : 1   EAST YORK  : 3   P:  0          
 M1J    : 1   ACTON      : 0                  
 (Other):96   (Other)    : 0                  
 >

# plot with spplot, rotate so Steeles Ave. is horizontal
torontoR <- elide(toronto, rotate=12.7)
spplot(torontoR, zcol="FSA", colorkey=FALSE)

In the associated data file, the first column is FSA.  I've used that as 
the rownames attribute,
but I could just use it as a separate column if that makes it easier to 
merge with the map

 > # read the attribute file
 > crime <- read.csv("Provincial-edited.csv", row.names=1)
 > crime[,9:12] <- crime[,9:12]*100
 > # Toronto subset
 > crimeTO <- crime[substr(rownames(crime),1,1)=="M",]
 > str(crimeTO)
'data.frame':   102 obs. of  13 variables:
$ Area                      : Factor w/ 209 levels "Acton","Ajax",..: 
166 166 166 166 166 166 166 166 166 166 ...
$ Total.Jail.Cost           : int  159807 69755 284576 164400 24035 
86526 269514 140899 138122 119962 ...
$ Ontario.Rank              : int  107 239 37 104 340 204 40 123 129 147 
...
$ Number.of.Inmates         : int  10 2 11 5 3 7 13 6 3 3 ...
$ Inmates.per.10K           : num  1.6 0.6 2.4 1.8 1.4 2 2.8 2.2 1.4 1.4 
...
$ Total.Days.Sentenced      : int  1496 653 2664 1539 225 810 2523 1319 
1293 1123 ...
$ Population                : int  64632 35695 46757 28458 23511 35005 
47224 27825 22138 21122 ...
$ Median.Household.Income   : int  65479 91372 58015 45150 51433 48425 
46191 44522 59426 58962 ...
$ Low.Income                : num  17 7 21 30 23 29 27 29 19 16 ...
$ Unemployed                : num  5 3 6 9 6 8 7 7 5 5 ...
$ Completed.University      : num  17 26 18 15 23 15 13 20 20 22 ...
$ Single.Female.Parent.Homes: num  20 12 21 20 16 22 22 21 18 16 ...
$ Public.Housing.Units      : int  496 NA 1226 521 149 173 743 685 295 
124 ...
 >
 > head(crimeTO)
          Area Total.Jail.Cost Ontario.Rank Number.of.Inmates 
Inmates.per.10K Total.Days.Sentenced Population
M1B Scarborough          159807          107                
10             1.6                 1496      64632
M1C Scarborough           69755          239                 
2             0.6                  653      35695
M1E Scarborough          284576           37                
11             2.4                 2664      46757
M1G Scarborough          164400          104                 
5             1.8                 1539      28458
M1H Scarborough           24035          340                 
3             1.4                  225      23511
M1J Scarborough           86526          204                 
7             2.0                  810      35005
   Median.Household.Income Low.Income Unemployed Completed.University 
Single.Female.Parent.Homes
M1B                   65479         17          5                   
17                         20
M1C                   91372          7          3                   
26                         12
M1E                   58015         21          6                   
18                         21
M1G                   45150         30          9                   
15                         20
M1H                   51433         23          6                   
23                         16
M1J                   48425         29          8                   
15                         22
   Public.Housing.Units
M1B                  496
M1C                   NA
M1E                 1226
M1G                  521
M1H                  149
M1J                  173
 >

So, I now want to merge torontoR with crimeTO using FSA (or 
rownames(crimeTO)) as the area ID
and write new files so I can avoid doing these steps in future.

Can someone help?

-- 
Michael Friendly     Email: friendly AT yorku DOT ca 
Professor, Psychology Dept.
York University      Voice: 416 736-5115 x66249 Fax: 416 736-5814
4700 Keele Street    http://www.math.yorku.ca/SCS/friendly.html
Toronto, ONT  M3J 1P3 CANADA




More information about the R-sig-Geo mailing list