Skip to contents

One feature of the getACS package is support for building tables with the gt package. To demonstrate, we need data for a few different tables from the American Community Survey:

acs_data <- get_acs_tables(
  geography = "county",
  state = "MD",
  table = c("B01003", "B15003", "B25003"),
  quiet = TRUE
)

To start, we can use filter_acs() to filter one or more tables from the ACS data frame:

pop_tbl_data <- acs_data |>
  filter_acs(
    table = "B01003"
  ) |>
  slice_max(estimate, n = 5)

Then, you can use select_acs_cols() to select the estimate, percent estimate, name, and column title columns. In this example, setting column_title_col and perc_est_cols to NULL drops those columns from the data frame:

pop_tbl_data <- pop_tbl_data |>
  select_acs_cols(
    est_cols = "estimate",
    name_col = "NAME",
    column_title_col = NULL,
    perc_est_cols = NULL
  )

The main table building function is gt_acs() which is a wrapper for gt::gt(), gt::cols_label(), gt::cols_merge_uncert() and other gt functions. Based on the predictable structure of ACS data, this function can merge estimate and margin of error columns, format estimate and percent estimate columns, and set a source note with a survey and table attribution. Additional helpers can support common formatting tasks when working with American Community Survey data, such as fmt_acs_county() stripping the state name and trailing comma from the ACS data frame name column.

pop_tbl_data |>
  gt_acs(
    table = "B01003",
    est_cols = "estimate",
    est_col_label = "Population",
    name_col_label = "County"
  ) |>
  fmt_acs_county(
    state = "Maryland",
    pattern = "(County|), {state}"
  )
County est_cols moe
Montgomery 1057201 NA
Prince George's 957767 NA
Baltimore 850702 NA
Baltimore city 592211 NA
Anne Arundel 584064 NA
Source: 2017-2021 ACS 5-year Estimates, Table B01003.

Many helper functions are all built around tidyverse functions so additional parameters passed to filter_data() are passed to dplyr::filter() so subsetting data by indent, line_number, or other attributes is straightforward:

edu_tbl_data <- acs_data |>
  filter_acs(
    table = "B15003",
    indent > 0,
    line_number > 16,
    NAME == "Baltimore city, Maryland"
  )

Similarly, gt_acs() returns a gt_tbl object so it can be combined with other gt functions to add headers or customize tables in other ways:

edu_tbl_data |>
  select_acs_cols(name_col = NULL) |>
  gt_acs(
    table = edu_tbl_data$table_id[[1]],
    column_title_label = "Education",
    est_col_label = "Estimate",
    perc_col_label = "% of total"
  ) |>
  tab_header(
    edu_tbl_data$table_title[[1]],
    edu_tbl_data$NAME[[1]]
  )
Educational Attainment for the Population 25 Years and Over
Baltimore city, Maryland
Education Estimate % of total
Regular high school diploma 95,925 ± 2,657 23% ± 1%
GED or alternative credential 20,737 ± 1,380 5% ± 0%
Some college, less than 1 year 24,460 ± 1,264 6% ± 0%
Some college, 1 or more years, no degree 53,735 ± 2,074 13% ± 0%
Associate's degree 21,425 ± 1,109 5% ± 0%
Bachelor's degree 71,550 ± 1,819 17% ± 0%
Master's degree 46,701 ± 1,643 11% ± 0%
Professional school degree 13,160 ± 837 3% ± 0%
Doctorate degree 10,519 ± 733 3% ± 0%
Source: 2017-2021 ACS 5-year Estimates, Table B15003.

This flexibility makes it easy to quickly produce useful tables:

tenure_tbl_data <- acs_data |>
  filter_acs(
    table = "B25003",
    NAME == "Baltimore city, Maryland"
  )

tenure_tbl_data |>
  select_acs_cols(name_col = NULL) |>
  gt_acs(
    rowname_col = "column_title",
    est_col_label = "Units",
    table = tenure_tbl_data$table_id[[1]]
  ) |>
  tab_header(
    tenure_tbl_data$table_title[[1]],
    "Baltimore City, Maryland"
  )
Tenure
Baltimore City, Maryland
Units % share
Total 244,893 ± 1,599 100% ± 1%
Owner occupied 117,377 ± 1,910 48% ± 1%
Renter occupied 127,516 ± 2,368 52% ± 1%
Source: 2017-2021 ACS 5-year Estimates, Table B25003.

Helpers such as join_acs_geography_ratio() support additional features such as calculating a ratio between an estimate and the estimate for a reference geography:

comparison_data <- get_acs_geographies(
  geography = c("county", "metropolitan statistical area/micropolitan statistical area", "state"),
  county = "Baltimore city",
  state = "MD",
  msa = "Baltimore-Columbia-Towson, MD Metro Area",
  table = "B25105"
)

comparison_data |>
  join_acs_geography_ratio(
    geography = "county"
  ) |>
  select_acs_cols(
    name_col = "NAME",
    perc_est_cols = NULL,
    column_title_col = NULL,
    starts_with("ratio_")
  ) |>
  gt_acs() |>
  cols_merge_uncert_ext(
    c("ratio_estimate", "ratio_moe")
  )
NAME Est. ratio_estimate
Baltimore city, Maryland 1,184 ± 11 1.00 ± 0.01
Baltimore-Columbia-Towson, MD Metro Area 1,510 ± 8 1.28 ± 0.01
Maryland 1,605 ± 4 1.36 ± 0.01
Source: 2017-2021 ACS 5-year Estimates.