Search code examples
rmapsmatchingchoroplethcensus

R package "acs": Get county name, FIPS?


in search for a solution to an unsolved problem, I came across the acs package. I assume, there's no way within the choropleth package to get any county information from data in the format [city, state]. That's why pre-processing with acs needs to be done.

I tried following code to get the county information on a city:

library(acs)
geo.lookup(state="CA", place="San Francisco")

> geo.lookup(state="CA", place="San Francisco")
  state state.name          county.name place               place.name
1     6 California                 <NA>    NA                     <NA>
2     6 California San Francisco County 67000       San Francisco city
3     6 California     San Mateo County 73262 South San Francisco city

As we know, cities can be part of different counties. Most likely, I will go with the second

> geo.lookup(state="CA", place="San Francisco")[2,]

  state state.name          county.name place         place.name
2     6 California San Francisco County 67000 San Francisco city

by default.

My question: Is there a way to get the state abbreviation, county name and county FIPS, too? I could not find the answer in the documentation.

Also, for further processing (matching with choroplethr), the last "County" in county.name and "city" in place.name need to be removed.


Solution

  • Here's how to add the state abbreviation, county name, and county FIPS to your example. R has built-in variables for state names and state abbreviations. For the FIPS codes, I read a csv file from the Census Bureau's website.

    library(acs)
    library(tidyverse)
    
    states <- cbind(state.name, state.abb) %>% tbl_df()
    
    fips <-
      read_csv(
        "https://www2.census.gov/geo/docs/reference/codes/files/national_county.txt",
        col_names = c("state.abb", "statefp", "countyfp", "county.name", "classfp")
      )
    
    query <- geo.lookup(state = "CA", place = "San Francisco")[2, ] %>%
      tbl_df() %>%
      left_join(states, by = "state.name") %>%
      left_join(fips, by = c("county.name", "state.abb"))
    
    query
    
    # # A tibble: 1 x 9
    # state state.name          county.name place         place.name state.abb statefp countyfp classfp
    # <chr>      <chr>                <chr> <int>              <chr>     <chr>   <chr>    <chr>   <chr>
    #   1     6 California San Francisco County 67000 San Francisco city        CA      06      075      H6
    

    As you note at the end of your question, you may need to clean up this data a bit more to make it fit choroplethr.