Writing about visualization, demographics, dashboards, and spatial data science.

Interested in learning more? Hire me for a workshop or to consult on your next project. See the Services page for more details.

New in the tigris package: simple features support and historic shapefiles

· by Kyle Walker · Read in about 3 min · (536 Words)
r census tigris

I am excited to announce that tigris 0.5 is now on CRAN. This is a major release that has been in the works for several months. Get it with install.packages("tigris").

One major new feature is support for the simple features data model via the sf R package. sf allows for the representation of spatial objects in R like data frames, but with a list-column containing feature geometry. This has multiple advantages, as objects of class sf accept tidyverse functions for data wrangling and are much faster to work with. For tigris, this means that large objects like Census blocks or national railroads are much more usable in R.

To return an object of class sf via tigris, either supply the argument class = "sf" or set this globally in your R session with options(tigris_class = "sf"). For example:


options(tigris_class = "sf")

co <- counties(cb = TRUE)

## Simple feature collection with 6 features and 9 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -88.47323 ymin: 31.18113 xmax: -85.04931 ymax: 33.00682
## epsg (SRID):    4269
## proj4string:    +proj=longlat +datum=NAD83 +no_defs
## 1      01      005 00161528 0500000US01005 01005 Barbour   06 2291820706
## 2      01      023 00161537 0500000US01023 01023 Choctaw   06 2365954971
## 3      01      035 00161543 0500000US01035 01035 Conecuh   06 2201896058
## 4      01      051 00161551 0500000US01051 01051  Elmore   06 1601876535
## 5      01      065 00161558 0500000US01065 01065    Hale   06 1667804583
## 6      01      109 00161581 0500000US01109 01109    Pike   06 1740741211
##     AWATER                       geometry
## 1 50864677 MULTIPOLYGON(((-85.748032 3...
## 2 19059247 MULTIPOLYGON(((-88.473227 3...
## 3  6643480 MULTIPOLYGON(((-87.427204 3...
## 4 99850740 MULTIPOLYGON(((-86.413335 3...
## 5 32525874 MULTIPOLYGON(((-87.870464 3...
## 6  2336975 MULTIPOLYGON(((-86.199408 3...

geo_join and rbind_tigris still work with objects of class sf; however, you can use the *_join functions from the tidyverse as well.

The second major new feature is support for historic shapefiles going back to 1990. Historical data are available for the states, counties, tracts, and block_groups functions, and I’ve re-factored much of tigris’s code to easily accommodate other geographies if requested by users.


options(tigris_class = "sp")

par(mfrow = c(1, 3))

walk(c(1990, 2000, 2010), function(year) {
  plot(tracts("TX", "Denton", cb = TRUE, year = year), 
       main = paste0("Census tracts in Denton County, ", 

My motivation for these updates is twofold. First, I’m working on a new package called tidycensus that will integrate tigris with the decennial Census and American Community Survey APIs. This package will allow R users to return integrated spatial and demographic datasets as sf objects in one function call, and will be designed to work seamlessly within the tidyverse. Second, I’m starting a book project this summer called Analyzing the US Census with R. The book will cover Census data acquisition and wrangling; spatial modeling with Census data; and working with Census microdata from the Integrated Public Use Microdata Series, all within R. Look for updates on both projects in this space!

If you are interested in supporting the development of these projects, I encourage you to hire me for a workshop on these topics or to consult on your next project. Check out the Services page for information on how we can get started.