Drill-Down Tables: Medicare Physician & Other Practitioners Dataset

medicare data-analytics reactable reactablefmtr rstats r-bloggers

Create interactive drill-down tables for more effective data analysis.

Andrew Bruce https://andrewbruce.netlify.app
2022-05-11

Introduction

This is intended to be a step-by-step guide for data analysis of large, publicly available datasets. I’ll be working with a Medicare dataset named Medicare Physician & Other Practitioners - by Provider and Service that can be downloaded here. Note: You can currently get this dataset with data going all the way back to 2013 (21 GB), but, in the interest of filesize, I’m only going to be working with the most recent data, from 2019 (3 GB).

Packages

Dataset

The Medicare Physician & Other Practitioners by Provider and Service dataset provides information on use, payments, and submitted charges organized by National Provider Identifier (NPI), Healthcare Common Procedure Coding System (HCPCS) code, and place of service. This dataset is based on information gathered from CMS administrative claims data for Original Medicare Part B beneficiaries available from the CMS Chronic Conditions Data Warehouse.

A pdf document of the data dictionary is provided for further explanation, which you can view here, but in the interest of brevity, I’ll sum up the definitions relevant to this walkthrough (this is important as well, because I’ll be renaming the variables for ease of use in writing the code):

Variable Term Notes
npi National Provider Identifier Numeric identifier registered in NPPES of rendering provider on claim.
last Provider’s last name Org name for providers registered as an organization
first Provider’s first name Blank for providers registered as an organization
cred Provider’s credentials Blank for providers registered as an organization
gender Provider’s gender As reported in NPPES
entity Provider entity type I: providers registered as individuals
O: providers registered as organizations
street Provider’s street address As reported in NPPES
city Provider’s city As reported in NPPES
state Provider’s state As reported in NPPES
fips Provider’s state FIPS code Federal Information Processing System codes uniquely identify geographic areas
zip Provider’s zip code As reported in NPPES
ruca Provider’s RUCA code Rural-Urban Commuting Area Codes characterize the nation’s Census tracts regarding their rural and urban status and relationships
ruca_desc RUCA code description
country Provider’s country As reported in NPPES
ptype Provider’s specialty type Provider specialty code reported claim. For providers that reported several specialty codes, this is the specialty associated with the most services.
par Medicare Participation Indicator Identifies whether provider participates in Medicare and/or accepts assignment of allowed amounts. Non-PAR providers may accept allowed amounts for some services and not for other services.
hcpcs HCPCS code Code used to identify the specific medical service furnished by the provider
hcpcs_desc HCPCS description Description of HCPCS code
hcpcs_drug HCPCS drug indicator Identifies whether the HCPCS code is listed on the Medicare Part B Drug Average Sales Price (ASP) File.
pos Place of Service Identifies whether place of service submitted on claim is a facility (F) or non-facility (O)
pts Number of Medicare beneficiaries Number of distinct Medicare beneficiaries receiving the service for each npi, hcpcs, and pos.
proc Number of services provided Note: metrics used to count the number provided can vary from service to service
avg_sub Average Submitted Charge Amount Average of charges provider submitted for the service
avg_allow Average Medicare Allowed Amount Average of allowed amount for service; the sum of the amount Medicare pays, the deductible and coinsurance the beneficiary is responsible for paying, and any amounts a third party is responsible for paying.
avg_pymt Average Medicare Payment Amount Average amount Medicare paid after deductible and coinsurance amounts were deducted for service
avg_stand Average Medicare Standardized Payment Amount Standardization removes geographic differences in payment rates for individual services, such as those that account for local wages or input prices and makes Medicare payments across geographic areas comparable, so that differences reflect variation in factors such as physicians’ practice patterns and beneficiaries’ ability and willingness to obtain care.

Data Cleaning

Let’s take a look at our initial data frame:

mpfs_preview <- head(mpfs, 10)
paged_table(mpfs_preview)

Rename Columns

The column names are looking pretty long and unwieldy:

names(mpfs)
   [1] "Rndrng_NPI"                    "Rndrng_Prvdr_Last_Org_Name"    "Rndrng_Prvdr_First_Name"      
   [4] "Rndrng_Prvdr_MI"               "Rndrng_Prvdr_Crdntls"          "Rndrng_Prvdr_Gndr"            
   [7] "Rndrng_Prvdr_Ent_Cd"           "Rndrng_Prvdr_St1"              "Rndrng_Prvdr_St2"             
  [10] "Rndrng_Prvdr_City"             "Rndrng_Prvdr_State_Abrvtn"     "Rndrng_Prvdr_State_FIPS"      
  [13] "Rndrng_Prvdr_Zip5"             "Rndrng_Prvdr_RUCA"             "Rndrng_Prvdr_RUCA_Desc"       
  [16] "Rndrng_Prvdr_Cntry"            "Rndrng_Prvdr_Type"             "Rndrng_Prvdr_Mdcr_Prtcptg_Ind"
  [19] "HCPCS_Cd"                      "HCPCS_Desc"                    "HCPCS_Drug_Ind"               
  [22] "Place_Of_Srvc"                 "Tot_Benes"                     "Tot_Srvcs"                    
  [25] "Tot_Bene_Day_Srvcs"            "Avg_Sbmtd_Chrg"                "Avg_Mdcr_Alowd_Amt"           
  [28] "Avg_Mdcr_Pymt_Amt"             "Avg_Mdcr_Stdzd_Amt"

I’ll go ahead and rename them:

mpfs <- mpfs |>
  rename(
    npi = Rndrng_NPI,
    last = Rndrng_Prvdr_Last_Org_Name,
    first = Rndrng_Prvdr_First_Name,
    mid = Rndrng_Prvdr_MI,
    cred = Rndrng_Prvdr_Crdntls,
    gender = Rndrng_Prvdr_Gndr,
    entity = Rndrng_Prvdr_Ent_Cd,
    street = Rndrng_Prvdr_St1,
    street2 = Rndrng_Prvdr_St2,
    city = Rndrng_Prvdr_City,
    state = Rndrng_Prvdr_State_Abrvtn,
    fips = Rndrng_Prvdr_State_FIPS,
    zip = Rndrng_Prvdr_Zip5,
    ruca = Rndrng_Prvdr_RUCA,
    ruca_desc = Rndrng_Prvdr_RUCA_Desc,
    country = Rndrng_Prvdr_Cntry,
    ptype = Rndrng_Prvdr_Type,
    par = Rndrng_Prvdr_Mdcr_Prtcptg_Ind,
    hcpcs = HCPCS_Cd,
    hcpcs_desc = HCPCS_Desc,
    hcpcs_drug = HCPCS_Drug_Ind,
    pos = Place_Of_Srvc,
    pts = Tot_Benes,
    proc = Tot_Srvcs,
    proc_day = Tot_Bene_Day_Srvcs,
    avg_sub = Avg_Sbmtd_Chrg,
    avg_allow = Avg_Mdcr_Alowd_Amt,
    avg_pymt = Avg_Mdcr_Pymt_Amt,
    avg_stand = Avg_Mdcr_Stdzd_Amt
  )

names(mpfs)
   [1] "npi"        "last"       "first"      "mid"        "cred"       "gender"     "entity"    
   [8] "street"     "street2"    "city"       "state"      "fips"       "zip"        "ruca"      
  [15] "ruca_desc"  "country"    "ptype"      "par"        "hcpcs"      "hcpcs_desc" "hcpcs_drug"
  [22] "pos"        "pts"        "proc"       "proc_day"   "avg_sub"    "avg_allow"  "avg_pymt"  
  [29] "avg_stand"

Subset Data Frame

To cut down on the file size for this example, I want to subset this data frame for two conditions - Clinical Laboratories in the state of Georgia:

mpfs_ga_lab <- mpfs |>
  filter(
    state == "GA" & ptype == "Clinical Laboratory"
  )

mpfs_ga_lab_preview <- head(mpfs_ga_lab, 10)
paged_table(mpfs_ga_lab_preview)

Zipcode Dataset

I’d like to include some other information that isn’t included in this dataset, such as the county name. I came across a zip code dataset online that I’ll use:

zip_code_database_preview <- head(zip_code_database, 10)
paged_table(zip_code_database_preview)

I’ll subset it for Georgia:

ga_zip <- zip_code_database |>
  filter(state == "GA")

ga_zip_preview <- head(ga_zip, 10)
paged_table(ga_zip_preview)

Left-Join mpfs_ga_lab & ga_zip Datasets

ga_zip$zip <- as.character(ga_zip$zip)

combined_df <- left_join(mpfs_ga_lab, ga_zip, by = "zip")

combined_df_preview <- head(combined_df, 10)
paged_table(combined_df_preview)

Remove Rows with P.O. Boxes & NAs (npi & hcpcs)

mpfs_ga_lab <- combined_df |>
  filter(type != "PO BOX" & !is.na(npi) & !is.na(hcpcs))

mpfs_ga_lab_preview <- head(mpfs_ga_lab, 10)
paged_table(mpfs_ga_lab_preview)

Remove “County” Text from county column

mpfs_ga_lab$county <- gsub(" County", "", as.character(mpfs_ga_lab$county))

mpfs_ga_lab_preview <- head(mpfs_ga_lab, 10)
paged_table(mpfs_ga_lab_preview)

Remove Unneeded Columns

mpfs_ga_lab <- mpfs_ga_lab |>
  select(-(first:entity)) |>
  select(-street2, -state.x) |>
  select(-(country.x:par)) |>
  select(-hcpcs_drug, -proc_day) |>
  select(-(type:state.y)) |>
  select(-(timezone:country.y)) |>
  select(-avg_stand)

mpfs_ga_lab_preview <- head(mpfs_ga_lab, 10)
paged_table(mpfs_ga_lab_preview)

Correct npi, fips, & ruca Data Types

The npi, fips, and ruca columns are numeric data types when we need them to be character types. We can go ahead and fix those:

mpfs_ga_lab$npi <- as.character(mpfs_ga_lab$npi)
mpfs_ga_lab$fips <- as.character(mpfs_ga_lab$fips)
mpfs_ga_lab$ruca <- as.character(mpfs_ga_lab$ruca)

mpfs_ga_lab_preview <- head(mpfs_ga_lab, 10)
paged_table(mpfs_ga_lab_preview)

{reactable} Drill-Down Table

With {reactable}, we’ll create the drill-down table. To do this we need 2 separate tables. The top-level table will have summary-level information and the second-level table (accessible by clicking the arrow to the left of the lab’s name) will have a breakdown of the summary data.

Create Top-level Table

mpfs_ga_lab_top_level <- mpfs_ga_lab |>
  count(npi, last, city,
    county, zip,
    avg_sub, avg_allow,
    avg_pymt, pts, proc,
    name = "n_hcpcs"
  ) |>
  group_by(npi, last, city, county, zip) |>
  summarise(
    n_hcpcs                     = sum(n_hcpcs),
    pts                         = sum(pts),
    proc                        = round(sum(proc)),
    avg_sub                     = round(mean(avg_sub), 2),
    avg_allow                   = round(mean(avg_allow), 2),
    avg_pymt                    = round(mean(avg_pymt), 2),
    .groups                     = "drop"
  ) |>
  arrange(desc(proc))

paged_table(mpfs_ga_lab_top_level, options = list(max.print = 10))

Create Second-level Table

mpfs_ga_lab_sec_level <- mpfs_ga_lab |>
  select(
    npi, hcpcs, hcpcs_desc,
    pos, pts, proc, avg_sub,
    avg_allow, avg_pymt
  ) |>
  mutate(
    avg_sub = round(avg_sub, 2),
    avg_allow = round(avg_allow, 2),
    avg_pymt = round(avg_pymt, 2),
    pct_inc = ((avg_sub - avg_pymt) / avg_pymt) * 100,
    pct_diff = ((avg_sub - avg_pymt) / ((avg_sub + avg_pymt) / 2)) * 100,
    proc = round(proc)
  ) |>
  arrange(desc(proc))

# Rename POS levels for clarity
mpfs_ga_lab_sec_level <- mpfs_ga_lab_sec_level |>
  mutate(pos = case_when(
    pos == "F" ~ "Facility",
    pos == "O" ~ "Non-Facility"
  ))

mpfs_ga_lab_sec_level_preview <- head(mpfs_ga_lab_sec_level, 10)
paged_table(mpfs_ga_lab_sec_level_preview)

Create Drill-Down Table

Show code
drilldown_tbl <- reactable(
  data = mpfs_ga_lab_top_level,
  pagination = TRUE,
  highlight = TRUE,
  striped = TRUE,
  filterable = TRUE,
  compact = TRUE,
  paginationType = "simple",
  showPageSizeOptions = TRUE,
  onClick = "expand",
  class = "packages-table",
  rowStyle = list(cursor = "pointer"),
  theme = reactableTheme(cellPadding = "8px 12px"),
  defaultSorted = "proc",
  defaultSortOrder = "desc",
  defaultColDef = colDef(
    footerStyle = list(fontWeight = "italic"),
    headerClass = "col-header",
    footerClass = "col-footer",
    align = "left"
  ),
  columns = list(
    npi = colDef(show = F),
    last = colDef(name = "Clinical Laboratory", width = 400),
    city = colDef(name = "City"),
    county = colDef(name = "County"),
    zip = colDef(
      name = "Zip", width = 120,
      footer = "Averages",
      class = "number",
    ),
    n_hcpcs = colDef(
      name = "HCPCS",
      filterable = TRUE,
      footer = function(values) sprintf("%.2f", mean(values)),
      cell = color_tiles(mpfs_ga_lab_top_level,
        number_fmt = scales::comma
      )
    ),
    pts = colDef(
      name = "Patients",
      filterable = TRUE,
      footer = function(values) sprintf("%.2f", mean(values)),
      cell = color_tiles(mpfs_ga_lab_top_level,
        number_fmt = scales::comma
      )
    ),
    proc = colDef(
      name = "Procedures",
      filterable = TRUE,
      footer = function(values) sprintf("%.2f", mean(values)),
      cell = color_tiles(mpfs_ga_lab_top_level,
        number_fmt = scales::comma
      )
    ),
    avg_sub = colDef(
      name = "Avg Charge",
      class = "number",
      filterable = TRUE,
      footer = function(values) sprintf("$%.2f", mean(values)),
      cell = data_bars(mpfs_ga_lab_top_level,
        fill_color = c("#15607A", "orange"),
        align_bars = "left",
        text_position = "above",
        number_fmt = scales::number_format(
          accuracy      = 0.01,
          big.mark      = ",",
          trim          = "FALSE"
        ),
        round_edges = TRUE
      )
    ),
    avg_allow = colDef(
      name = "Avg Allowed",
      class = "number",
      filterable = TRUE,
      footer = function(values) sprintf("$%.2f", mean(values)),
      cell = data_bars(mpfs_ga_lab_top_level,
        fill_color = c("#15607A", "orange"),
        align_bars = "left",
        text_position = "above",
        number_fmt = scales::number_format(
          accuracy      = 0.01,
          big.mark      = ",",
          trim          = "FALSE"
        ),
        round_edges = TRUE
      )
    ),
    avg_pymt = colDef(
      name = "Avg Payment",
      class = "number",
      filterable = TRUE,
      footer = function(values) sprintf("$%.2f", mean(values)),
      cell = data_bars(mpfs_ga_lab_top_level,
        fill_color = c("#15607A", "orange"),
        align_bars = "left",
        text_position = "above",
        number_fmt = scales::number_format(
          accuracy      = 0.01,
          big.mark      = ",",
          trim          = "FALSE"
        ),
        round_edges = TRUE
      )
    )
  ),
  details = function(index) {
    sec_lvl <- mpfs_ga_lab_sec_level[mpfs_ga_lab_sec_level$npi == mpfs_ga_lab_top_level$npi[index], ]
    reactable(
      data = sec_lvl,
      pagination = TRUE,
      highlight = TRUE,
      striped = FALSE,
      filterable = TRUE,
      outlined = TRUE,
      compact = TRUE,
      paginationType = "simple",
      showPageSizeOptions = TRUE,
      defaultSorted = "proc",
      defaultSortOrder = "desc",
      defaultColDef = colDef(headerClass = "header", align = "left"),
      columns = list(
        npi = colDef(show = F),
        pos = colDef(name = "POS"),
        hcpcs = colDef(name = "HCPCS", class = "number"),
        hcpcs_desc = colDef(name = "HCPCS Description", width = 650),
        avg_sub = colDef(
          name = "Avg. Charge",
          class = "number",
          cell = data_bars(sec_lvl,
            fill_color = c("#15607A", "orange"),
            align_bars = "left",
            text_position = "above",
            number_fmt = scales::number_format(
              accuracy      = 0.01,
              big.mark      = ",",
              trim          = "FALSE"
            ),
            round_edges = TRUE
          )
        ),
        avg_allow = colDef(
          name = "Avg. Allowed",
          class = "number",
          cell = data_bars(sec_lvl,
            fill_color = c("#15607A", "orange"),
            align_bars = "left",
            text_position = "above",
            number_fmt = scales::number_format(
              accuracy      = 0.01,
              big.mark      = ",",
              trim          = "FALSE"
            ),
            round_edges = TRUE
          )
        ),
        avg_pymt = colDef(
          name = "Avg. Payment",
          class = "number",
          cell = data_bars(sec_lvl,
            fill_color = c("#15607A", "orange"),
            align_bars = "left",
            text_position = "above",
            number_fmt = scales::number_format(
              accuracy      = 0.01,
              big.mark      = ",",
              trim          = "FALSE"
            ),
            round_edges = TRUE
          )
        ),
        pct_inc = colDef(
          name = "% Increase",
          class = "number",
          cell = data_bars(sec_lvl,
            fill_color = c("#15607A", "orange"),
            align_bars = "left",
            text_position = "above",
            number_fmt = scales::number_format(
              accuracy      = 0.01,
              big.mark      = ",",
              suffix        = "%",
              trim          = "FALSE"
            ),
            round_edges = TRUE
          )
        ),
        pct_diff = colDef(
          name = "% Difference",
          class = "number",
          cell = data_bars(sec_lvl,
            fill_color = c("#15607A", "orange"),
            align_bars = "left",
            text_position = "above",
            number_fmt = scales::number_format(
              accuracy      = 0.01,
              big.mark      = ",",
              suffix        = "%",
              trim          = "FALSE"
            ),
            round_edges = TRUE
          )
        ),
        pts = colDef(
          name = "Patients",
          cell = color_tiles(
            sec_lvl,
            number_fmt = scales::comma
          )
        ),
        proc = colDef(
          name = "Procedures",
          cell = color_tiles(
            sec_lvl,
            number_fmt = scales::comma
          )
        )
      )
    )
  }
)

div(
  class = "rcm-analysis",
  h3(class = "packages-title", "Medicare Physician & Other Practitioners 2019: Clinical Laboratories in Georgia"),
  drilldown_tbl,
  tags$span(style = "color:#C8C8C8", "Table: @aabrucehimni | Data: data.cms.gov")
)

Medicare Physician & Other Practitioners 2019: Clinical Laboratories in Georgia

Table: @aabrucehimni | Data: data.cms.gov

Citations

Package Version Citation
base 4.2.0 R Core Team (2022)
distill 1.4 Dervieux et al. (2022)
grateful 0.1.11 Rodríguez-Sánchez, Jackson, and Hutchins (2022)
htmltools 0.5.2 Cheng et al. (2021)
knitr 1.39 Xie (2014); Xie (2015); Xie (2022)
reactable 0.2.3 Lin (2020)
reactablefmtr 2.0.0 Cuilla (2022)
rio 0.5.29 Chan et al. (2021)
rmarkdown 2.14 Xie, Allaire, and Grolemund (2018); Xie, Dervieux, and Riederer (2020); Allaire et al. (2022)
scales 1.2.0 Wickham and Seidel (2022)
sessioninfo 1.2.2 Wickham et al. (2021)
tidyverse 1.3.1 Wickham et al. (2019)
xaringanExtra 0.5.5 Aden-Buie and Warkentin (2022)

Last updated on

  [1] "2022-05-19 13:51:26 EDT"

Session Info

  ─ Session info ───────────────────────────────────────────────────────────────────────────────────
   setting  value
   version  R version 4.2.0 (2022-04-22 ucrt)
   os       Windows 10 x64 (build 25120)
   system   x86_64, mingw32
   ui       RTerm
   language (EN)
   collate  English_United States.utf8
   ctype    English_United States.utf8
   tz       America/New_York
   date     2022-05-19
   pandoc   2.17.1.1 @ C:/Program Files/RStudio/bin/quarto/bin/ (via rmarkdown)
  
  ─ Packages ───────────────────────────────────────────────────────────────────────────────────────
   package       * version date (UTC) lib source
   assertthat      0.2.1   2019-03-21 [1] CRAN (R 4.2.0)
   backports       1.4.1   2021-12-13 [1] CRAN (R 4.2.0)
   broom           0.8.0   2022-04-13 [1] CRAN (R 4.2.0)
   bslib           0.3.1   2021-10-06 [1] CRAN (R 4.2.0)
   cachem          1.0.6   2021-08-19 [1] CRAN (R 4.2.0)
   cellranger      1.1.0   2016-07-27 [1] CRAN (R 4.2.0)
   cli             3.3.0   2022-04-25 [1] CRAN (R 4.2.0)
   colorspace      2.0-3   2022-02-21 [1] CRAN (R 4.2.0)
   crayon          1.5.1   2022-03-26 [1] CRAN (R 4.2.0)
   crosstalk       1.2.0   2021-11-04 [1] CRAN (R 4.2.0)
   curl            4.3.2   2021-06-23 [1] CRAN (R 4.2.0)
   data.table      1.14.2  2021-09-27 [1] CRAN (R 4.2.0)
   DBI             1.1.2   2021-12-20 [1] CRAN (R 4.2.0)
   dbplyr          2.1.1   2021-04-06 [1] CRAN (R 4.2.0)
   digest          0.6.29  2021-12-01 [1] CRAN (R 4.2.0)
   distill         1.4     2022-05-12 [1] CRAN (R 4.2.0)
   downlit         0.4.0   2021-10-29 [1] CRAN (R 4.2.0)
   dplyr         * 1.0.9   2022-04-28 [1] CRAN (R 4.2.0)
   ellipsis        0.3.2   2021-04-29 [1] CRAN (R 4.2.0)
   evaluate        0.15    2022-02-18 [1] CRAN (R 4.2.0)
   fansi           1.0.3   2022-03-24 [1] CRAN (R 4.2.0)
   fastmap         1.1.0   2021-01-25 [1] CRAN (R 4.2.0)
   forcats       * 0.5.1   2021-01-27 [1] CRAN (R 4.2.0)
   foreign         0.8-82  2022-01-16 [2] CRAN (R 4.2.0)
   fs              1.5.2   2021-12-08 [1] CRAN (R 4.2.0)
   generics        0.1.2   2022-01-31 [1] CRAN (R 4.2.0)
   ggplot2       * 3.3.6   2022-05-03 [1] CRAN (R 4.2.0)
   glue            1.6.2   2022-02-24 [1] CRAN (R 4.2.0)
   grateful      * 0.1.11  2022-05-07 [1] Github (Pakillo/grateful@ba9b003)
   gtable          0.3.0   2019-03-25 [1] CRAN (R 4.2.0)
   haven           2.5.0   2022-04-15 [1] CRAN (R 4.2.0)
   highr           0.9     2021-04-16 [1] CRAN (R 4.2.0)
   hms             1.1.1   2021-09-26 [1] CRAN (R 4.2.0)
   htmltools     * 0.5.2   2021-08-25 [1] CRAN (R 4.2.0)
   htmlwidgets     1.5.4   2021-09-08 [1] CRAN (R 4.2.0)
   httr            1.4.3   2022-05-04 [1] CRAN (R 4.2.0)
   jquerylib       0.1.4   2021-04-26 [1] CRAN (R 4.2.0)
   jsonlite        1.8.0   2022-02-22 [1] CRAN (R 4.2.0)
   knitr         * 1.39    2022-04-26 [1] CRAN (R 4.2.0)
   lifecycle       1.0.1   2021-09-24 [1] CRAN (R 4.2.0)
   lubridate       1.8.0   2021-10-07 [1] CRAN (R 4.2.0)
   magrittr        2.0.3   2022-03-30 [1] CRAN (R 4.2.0)
   memoise         2.0.1   2021-11-26 [1] CRAN (R 4.2.0)
   modelr          0.1.8   2020-05-19 [1] CRAN (R 4.2.0)
   munsell         0.5.0   2018-06-12 [1] CRAN (R 4.2.0)
   openxlsx        4.2.5   2021-12-14 [1] CRAN (R 4.2.0)
   pillar          1.7.0   2022-02-01 [1] CRAN (R 4.2.0)
   pkgconfig       2.0.3   2019-09-22 [1] CRAN (R 4.2.0)
   purrr         * 0.3.4   2020-04-17 [1] CRAN (R 4.2.0)
   R.cache         0.15.0  2021-04-30 [1] CRAN (R 4.2.0)
   R.methodsS3     1.8.1   2020-08-26 [1] CRAN (R 4.2.0)
   R.oo            1.24.0  2020-08-26 [1] CRAN (R 4.2.0)
   R.utils         2.11.0  2021-09-26 [1] CRAN (R 4.2.0)
   R6              2.5.1   2021-08-19 [1] CRAN (R 4.2.0)
   Rcpp            1.0.8.3 2022-03-17 [1] CRAN (R 4.2.0)
   reactable     * 0.2.3   2020-10-04 [1] CRAN (R 4.2.0)
   reactablefmtr * 2.0.0   2022-03-16 [1] CRAN (R 4.2.0)
   reactR          0.4.4   2021-02-22 [1] CRAN (R 4.2.0)
   readr         * 2.1.2   2022-01-30 [1] CRAN (R 4.2.0)
   readxl          1.4.0   2022-03-28 [1] CRAN (R 4.2.0)
   renv            0.15.4  2022-03-03 [1] CRAN (R 4.2.0)
   reprex          2.0.1   2021-08-05 [1] CRAN (R 4.2.0)
   rio           * 0.5.29  2021-11-22 [1] CRAN (R 4.2.0)
   rlang           1.0.2   2022-03-04 [1] CRAN (R 4.2.0)
   rmarkdown     * 2.14    2022-04-25 [1] CRAN (R 4.2.0)
   rstudioapi      0.13    2020-11-12 [1] CRAN (R 4.2.0)
   rvest           1.0.2   2021-10-16 [1] CRAN (R 4.2.0)
   sass            0.4.1   2022-03-23 [1] CRAN (R 4.2.0)
   scales          1.2.0   2022-04-13 [1] CRAN (R 4.2.0)
   sessioninfo     1.2.2   2021-12-06 [1] CRAN (R 4.2.0)
   stringi         1.7.6   2021-11-29 [1] CRAN (R 4.2.0)
   stringr       * 1.4.0   2019-02-10 [1] CRAN (R 4.2.0)
   styler          1.7.0   2022-03-13 [1] CRAN (R 4.2.0)
   tibble        * 3.1.7   2022-05-03 [1] CRAN (R 4.2.0)
   tidyr         * 1.2.0   2022-02-01 [1] CRAN (R 4.2.0)
   tidyselect      1.1.2   2022-02-21 [1] CRAN (R 4.2.0)
   tidyverse     * 1.3.1   2021-04-15 [1] CRAN (R 4.2.0)
   tzdb            0.3.0   2022-03-28 [1] CRAN (R 4.2.0)
   utf8            1.2.2   2021-07-24 [1] CRAN (R 4.2.0)
   uuid            1.1-0   2022-04-19 [1] CRAN (R 4.2.0)
   vctrs           0.4.1   2022-04-13 [1] CRAN (R 4.2.0)
   withr           2.5.0   2022-03-03 [1] CRAN (R 4.2.0)
   xaringanExtra   0.5.5   2022-04-26 [1] Github (gadenbuie/xaringanExtra@ee5092d)
   xfun            0.31    2022-05-10 [1] CRAN (R 4.2.0)
   xml2            1.3.3   2021-11-30 [1] CRAN (R 4.2.0)
   yaml            2.3.5   2022-02-21 [1] CRAN (R 4.2.0)
   zip             2.2.0   2021-05-31 [1] CRAN (R 4.2.0)
  
   [1] C:/Users/andyb/AppData/Local/R/win-library/4.2
   [2] C:/Program Files/R/R-4.2.0/library
  
  ──────────────────────────────────────────────────────────────────────────────────────────────────
Aden-Buie, Garrick, and Matthew T. Warkentin. 2022. xaringanExtra: Extras and Extensions for Xaringan Slides. https://github.com/gadenbuie/xaringanExtra.
Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, Winston Chang, and Richard Iannone. 2022. Rmarkdown: Dynamic Documents for r. https://github.com/rstudio/rmarkdown.
Chan, Chung-hong, Geoffrey CH Chan, Thomas J. Leeper, and Jason Becker. 2021. Rio: A Swiss-Army Knife for Data File i/o.
Cheng, Joe, Carson Sievert, Barret Schloerke, Winston Chang, Yihui Xie, and Jeff Allen. 2021. Htmltools: Tools for HTML. https://CRAN.R-project.org/package=htmltools.
Cuilla, Kyle. 2022. Reactablefmtr: Streamlined Table Styling and Formatting for Reactable. https://CRAN.R-project.org/package=reactablefmtr.
Dervieux, Christophe, JJ Allaire, Rich Iannone, Alison Presmanes Hill, and Yihui Xie. 2022. Distill: ’R Markdown’ Format for Scientific and Technical Writing. https://CRAN.R-project.org/package=distill.
Lin, Greg. 2020. Reactable: Interactive Data Tables Based on ’React Table’. https://CRAN.R-project.org/package=reactable.
R Core Team. 2022. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Rodríguez-Sánchez, Francisco, Connor P. Jackson, and Shaurita D. Hutchins. 2022. Grateful: Facilitate Citation of r Packages. https://github.com/Pakillo/grateful.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Wickham, Hadley, Winston Chang, Robert Flight, Kirill Müller, and Jim Hester. 2021. Sessioninfo: R Session Information. https://CRAN.R-project.org/package=sessioninfo.
Wickham, Hadley, and Dana Seidel. 2022. Scales: Scale Functions for Visualization. https://CRAN.R-project.org/package=scales.
Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC. http://www.crcpress.com/product/isbn/9781466561595.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2022. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
Xie, Yihui, Christophe Dervieux, and Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.

References

Corrections

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY 4.0. Source code is available at https://github.com/andrewallenbruce, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

Citation

For attribution, please cite this work as

Bruce (2022, May 11). Andrew Bruce: Drill-Down Tables: Medicare Physician & Other Practitioners Dataset. Retrieved from https://andrewbruce.netlify.app/posts/drilldowns-medicare-physician-other-practitioners/

BibTeX citation

@misc{bruce2022drill-down,
  author = {Bruce, Andrew},
  title = {Andrew Bruce: Drill-Down Tables: Medicare Physician & Other Practitioners Dataset},
  url = {https://andrewbruce.netlify.app/posts/drilldowns-medicare-physician-other-practitioners/},
  year = {2022}
}