Create interactive drill-down tables for more effective data analysis.
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).
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. |
Let’s take a look at our initial data frame:
mpfs_preview <- head(mpfs, 10)
paged_table(mpfs_preview)
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"
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)
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)
mpfs_ga_lab & ga_zip Datasetsga_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)
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)
county columnmpfs_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)
first, mid, cred,
gender, street2, (all are empty)country.x, country.y (all are US)state.x, state.y (all are GA)entity (all are Organizations)par (all are participating)ptype (all are Clinical Laboratories)hcpcs_drug (no drug codes, all are diagnostic
tests)proc_day (no difference between procedures and
procedures per day)type (all are standard)decommissioned, primary_city,
acceptable_cities, unacceptable_cities,
timezone, area_codes,
world_region (unneeded)avg_stand (negligible difference between payments and
standardized payments)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)
npi,
fips, & ruca Data TypesThe 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)
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.
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))
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)
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")
)
| 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) |
[1] "2022-05-19 13:51:26 EDT"
─ 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
──────────────────────────────────────────────────────────────────────────────────────────────────
If you see mistakes or want to suggest changes, please create an issue on the source repository.
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 ...".
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}
}