Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
First transforming the data was easy using ddply in the plyr package after I had queried all the right zip codes into a data frame from the database.
library("plyr")
w=ddply(sanfran, .(zip), summarise, pricepersqft=mean(price/sqft))
Then it’s a matter of loading the shape file after downloading it from here.
library(maptools)
library(RColorBrewer)
library(classInt)
zip=readShapePoly("bayarea_zipcodes.shp")
The ddply
will sort the zip codes, so I transformed the zip spatial data into a regular data frame, merged it with “w”, added pricepersqft
to an ordered “zip” data frame, and finally subset out zips without data.
##transform to regular data frame
a=as.data.frame(zip)
##merge with the ddply data
r=merge(a, w, all=TRUE)
##order zips in the spatial poly data
d=zip[order(zip$ZIP),]
##merge price per sqft with spatial data
d@data$pricepersqft=r$pricepersqft
##subset out zips with missing data
yy=d[!is.na(d$pricepersqft),]
Finally comes the plotting, which ,luckily, is almost exactly the same as the example that it I found above.
#select color palette and the number colors(prices per sqft) to represent on the map colors
colors=brewer.pal(9, "YlOrRd")
#set breaks for the 9 colors
brks=classIntervals(zip$INCOME, n=9, style="quantile")
brks=brks$brks
#plot the map
plot(zip, col=colors[findInterval(zip$INCOME, brks,all.inside=TRUE)], axes=F)
#add a title
title(paste ("SF Bay Area Price Per SQFT for rentals by Zip"))
#add a legend
legend(x=6298809, y=2350000, legend=leglabs(round(brks)), fill=colors, bty="n",x.intersp = .5, y.intersp = .5)
Here are the actual current averages of rental prices by zip:
QED
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.