library("gt")
library("gtExtras")
library("sf")
library("tidytext")
library("tidyverse")
stop_words <- tidytext::get_stopwords()Goal
Today, I wanted to explore the data sets assembled by Grant Witness (Noam Ross, et al). This data is about terminations of research grants in the USA in the year 2025.
The data can be downloaded as 3 CSV files
epa_terminations.csvnih_terminations.csvnsf_terminations.csv
which refer to the EPA (Environmental Protection Agency), NIH (National Institutes of Health), and NSF (National Science Foundation) respectively.
banned_words <- readLines("data/banned_words.txt")
EPA_raw <- readr::read_csv("data/epa_terminations.csv")
NIH_raw <- readr::read_csv("data/nih_terminations.csv")
NSF_raw <- readr::read_csv("data/nsf_terminations.csv")
states_shp <- readr::read_rds("data/us_states_shp.rds")Data Wrangling
colnames(EPA_raw) [1] "grant_id" "status"
[3] "event_history" "termination_date"
[5] "termination_indicator" "reinstatement_date"
[7] "reinstatement_indicator" "project_title"
[9] "organization" "start_date"
[11] "original_end_date" "award_value"
[13] "award_outlaid" "award_frozen"
[15] "award_remaining" "notes"
[17] "org_state" "org_city"
[19] "org_county" "org_zip"
[21] "project_description" "org_type"
[23] "award_region" "gs_org"
[25] "cfda_number" "cfda_title"
[27] "funding_opportunity_number" "funding_opportunity_goals"
[29] "usaspending_url" "nggs_url"
colnames(NIH_raw) [1] "status" "core_award_number"
[3] "full_award_number" "hhs_web_reported"
[5] "hhs_pdf_reported" "self_reported"
[7] "court_reported" "source_reported"
[9] "targeted_start_date" "targeted_end_date"
[11] "ever_frozen" "frozen_date"
[13] "unfrozen_date" "file_c_outlays"
[15] "termination_date" "cancellation_source"
[17] "reinstatement_indicator" "reinstated_est_date"
[19] "reinstatement_case" "last_payment_month"
[21] "last_payment_date" "project_title"
[23] "activity_code" "org_name"
[25] "org_type" "dept_type"
[27] "program_office" "org_state"
[29] "org_city" "org_congdist"
[31] "us_rep" "us_rep_phone"
[33] "flagged_words" "study_section"
[35] "foa" "foa_title"
[37] "abstract_text" "phr_text"
[39] "terms" "total_award"
[41] "total_estimated_outlays" "total_estimated_remaining"
[43] "spending_categories" "notes"
[45] "org_traits" "pct_ugrad_pellgrant"
[47] "pct_ugrad_fedloan" "appl_id"
[49] "prog_office_code" "funding_category"
[51] "nih_activity" "court_restoration_url"
[53] "usaspending_url" "taggs_url"
[55] "reporter_url" "record_sha1"
colnames(NSF_raw) [1] "grant_id" "status"
[3] "terminated" "suspended"
[5] "termination_date" "termination_indicator"
[7] "reinstated" "reinstatement_date"
[9] "reinstatement_indicator" "cruz_list"
[11] "nsf_url" "usaspending_url"
[13] "project_title" "abstract"
[15] "org_name" "org_state"
[17] "org_city" "award_type"
[19] "usasp_start_date" "usasp_end_date"
[21] "nsf_start_date" "nsf_end_date"
[23] "nsf_program_name" "nsf_primary_program"
[25] "usasp_nsf_office" "nsf_total_budget"
[27] "nsf_obligated" "usasp_total_obligated"
[29] "usasp_obligation_hist" "usasp_total_obligated_corrected"
[31] "usasp_outlaid" "estimated_budget"
[33] "estimated_outlays" "estimated_remaining"
[35] "post_termination_deobligation" "division"
[37] "directorate" "div"
[39] "dir" "record_sha1"
banned_words_df <- as.data.frame(banned_words)
banned_words_df <- banned_words_df |>
mutate(banned_words = stringr::str_trim(banned_words),
n_char = nchar(banned_words)) |>
filter(n_char > 0) |>
mutate(banned_words = stringr::str_to_lower(banned_words))
banned_words <- banned_words_df |>
pull(banned_words)print(banned_words_df$banned_words) [1] "activism" "activists" "advocacy"
[4] "advocate" "barrier" "barriers"
[7] "biased" "bias" "bipoc"
[10] "black and latinx" "community diversity" "community equity"
[13] "cultural differences" "cultural heritage" "culturally responsive"
[16] "disabilities" "discrimination" "discriminatory"
[19] "backgrounds" "groups" "diversified"
[22] "diversify" "enhancing" "equal opportunity"
[25] "equality" "equitable" "ethnicity"
[28] "excluded" "female" "fostering"
[31] "gender" "hate speech" "hispanic minority"
[34] "historically" "implicit bias" "inclusion"
[37] "inclusive" "increase" "indigenous community"
[40] "inequalities" "inequities" "institutional"
[43] "lgbtq" "marginalize" "minorities"
[46] "multicultural" "polarization" "political"
[49] "prejudice" "privileges" "promoting"
[52] "race" "racial" "justice"
[55] "sense of belonging" "sexual preferences" "social justice"
[58] "sociocultural" "socioeconomic" "status"
[61] "stereotypes" "systemic" "trauma"
[64] "underappreciated" "underrepresented" "underserved"
[67] "victim" "women"
intersect(colnames(NIH_raw), colnames(NSF_raw))[1] "status" "termination_date"
[3] "reinstatement_indicator" "project_title"
[5] "org_name" "org_state"
[7] "org_city" "usaspending_url"
[9] "record_sha1"
For now, I am going to focus on the NIH and NSF data since their tables are more similar. It appears that the column names are not uniform, so let’s search for columns of interest.
Subset
I then looked at the spreadsheets directly.
intersect_columns <- intersect(colnames(NIH_raw), colnames(NSF_raw))
df_NIH <- NIH_raw |>
select(all_of(intersect_columns), abstract_text, total_award, dept_type)
df_NSF <- NSF_raw |>
select(all_of(intersect_columns), abstract, nsf_total_budget, nsf_program_name)
common_columns <- c("status", "termination_date", "reinstatement_ind", "project_title", "org_name", "org_state", "org_city", "usaspending_url", "record_sha1", "abstract", "budget", "subdivsion")
colnames(df_NIH) <- common_columns
colnames(df_NSF) <- common_columns
df_NIH <- df_NIH |> mutate(agency = "NIH")
df_NSF <- df_NSF |> mutate(agency = "NSF")
df <- rbind(df_NIH, df_NSF) |>
mutate(org_name = stringr::str_to_title(org_name))Princeton Impact
My audience will want to know about the grants that directly relate to Princeton University. Here, I simply look at the org_name variable (i.e. this approach may miss grants with collaborators across multiple universities).
df_Princeton <- df |>
filter(stringr::str_detect(org_name, "Princeton")) |>
tidyr::fill(termination_date, .direction = "down")Table
df_Princeton |>
select(agency, org_city, termination_date, budget, project_title) |>
arrange(termination_date) |>
gt() |>
cols_align(align = "center") |>
fmt_currency(columns = "budget", currency = "USD") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated Grants at Princeton University",
subtitle = "NIH and NSF Grants"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "#E77500"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "org_city")
)| Terminated Grants at Princeton University | ||||
| NIH and NSF Grants | ||||
| agency | org_city | termination_date | budget | project_title |
|---|---|---|---|---|
| NIH | Princeton | 2025-03-12 | $148,460.00 | The psychological underpinnings of gender disparities in adolescent mental health |
| NIH | Princeton | 2025-03-12 | $247,610.00 | Circuit Reconstruction of Functionally-Identified Neurons in Deep Brain Regions: Application to Grid Cells |
| NIH | Princeton | 2025-03-12 | $250,000.00 | Building Dendrite Architecture via Microtubule Nucleation |
| NIH | Princeton | 2025-03-12 | $271,978.00 | Mapping Neural Dynamics in Hormone-sensitive Networks |
| NIH | Princeton | 2025-03-12 | $1,331,240.19 | Views of Gender in Adolescence |
| NIH | Princeton | 2025-04-02 | $35,974.00 | The Role of the Adaptor Protein Enkurin in Left-Right Patterning- a Promising Link Between Polycystin-2 and Calcium Signaling |
| NIH | Princeton | 2025-05-16 | $32,974.00 | Delineating the impact of human karyopherins on hepatitis B virus species tropism |
| NSF | PRINCETON | 2025-05-22 | $61,560.00 | Collaborative Research: HCC: Designing Technologies for Marginalized Communities |
| NSF | PRINCETON | 2025-05-22 | $414,688.00 | Daily Watcher Tracking Survey and Monitoring the Effects of War on Public Opinion |
| NSF | PRINCETON | 2025-05-22 | $74,948.00 | RCN-UBE Incubator: Project Leadership - Embedding Inclusive Leadership Experiences in the STEM Classroom |
| NSF | PRINCETON | 2025-05-22 | $400,000.00 | Conference: Support for Conferences and Mentoring of Women |
| NIH | Princeton | 2025-06-05 | $1,015,148.00 | Hyster (Rivas-Souchet) Diversity Supplement |
| Source: Grant Witness | ||||
Other Affected Universities
Here, we perform some segmentation and pivoting to find the top 10 organizations that were affected by the terminated grants (for both NIH and NSF grants)
NIH
df |>
filter(agency == "NIH") |>
group_by(org_name) |>
mutate(num_grants = n()) |>
ungroup() |>
select(agency, org_name, num_grants) |>
distinct() |>
slice_max(n = 10, order_by = num_grants) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated Grants at Universities",
subtitle = "NIH Grants, top 10 organizations affected"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "springgreen"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "org_name")
)| Terminated Grants at Universities | ||
| NIH Grants, top 10 organizations affected | ||
| agency | org_name | num_grants |
|---|---|---|
| NIH | Columbia University Health Sciences | 956 |
| NIH | Northwestern University At Chicago | 623 |
| NIH | University Of California Los Angeles | 519 |
| NIH | Harvard Medical School | 352 |
| NIH | Brown University | 244 |
| NIH | Cornell University | 189 |
| NIH | Duke University | 185 |
| NIH | Harvard University D/B/A Harvard School Of Public Health | 162 |
| NIH | Harvard University | 144 |
| NIH | University Of California, San Francisco | 131 |
| Source: Grant Witness | ||
NSF
df |>
filter(agency == "NSF") |>
group_by(org_name) |>
mutate(num_grants = n()) |>
ungroup() |>
select(agency, org_name, num_grants) |>
distinct() |>
slice_max(n = 10, order_by = num_grants) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated Grants at Universities",
subtitle = "NSF Grants, top 10 organizations affected"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "cadetblue1"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "org_name")
)| Terminated Grants at Universities | ||
| NSF Grants, top 10 organizations affected | ||
| agency | org_name | num_grants |
|---|---|---|
| NSF | University Of California-Los Angeles | 306 |
| NSF | Harvard University | 200 |
| NSF | Arizona State University | 28 |
| NSF | Regents Of The University Of Michigan - Ann Arbor | 28 |
| NSF | University Of Colorado At Boulder | 24 |
| NSF | Michigan State University | 18 |
| NSF | University Of Washington | 17 |
| NSF | Florida International University | 17 |
| NSF | University Of Texas At Austin | 16 |
| NSF | University Of Wisconsin-Madison | 16 |
| Source: Grant Witness | ||
Geospatial
df_state_group <- df |>
group_by(agency, org_state) |>
mutate(num_grants = n()) |>
ungroup() |>
select(agency, org_state, num_grants) |>
distinct()
df_state_group$num_grants <- as.numeric(df_state_group$num_grants)
shp_and_df <- states_shp |>
left_join(df_state_group, by = join_by(STUSPS == org_state))Magnitude
NIH
shp_and_df |>
filter(agency == "NIH") |>
ggplot() +
geom_sf(aes(fill = log(num_grants))) +
labs(title = "Terminated Grants at Universities",
subtitle = "NIH Grants",
caption = "Source: Grant Witness") +
scale_fill_gradient(low = "red", high = "blue") +
theme_minimal()
NSF
shp_and_df |>
filter(agency == "NSF") |>
ggplot() +
geom_sf(aes(fill = log(num_grants))) +
labs(title = "Terminated Grants at Universities",
subtitle = "NSF Grants",
caption = "Source: Grant Witness") +
scale_fill_gradient(low = "red", high = "blue") +
theme_minimal()
Words
Titles
NIH
NIH_title_words <- df |>
filter(agency == "NIH") |>
select(project_title) |>
tidytext::unnest_tokens(word, project_title) |>
count(word) |>
anti_join(stop_words, by = "word")tab1 <- NIH_title_words |>
arrange(desc(n)) |>
slice(1:10) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated NIH Grants",
subtitle = "Most Frequent Words in Titles"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "springgreen"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "word")
)tab2 <- NIH_title_words |>
arrange(desc(n)) |>
slice(11:20) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated NIH Grants",
subtitle = "Most Frequent Words in Titles"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "springgreen"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "word")
)list(tab1, tab2) |>
gtExtras::gt_two_column_layout()| Terminated NIH Grants | |
| Most Frequent Words in Titles | |
| word | n |
|---|---|
| health | 518 |
| research | 404 |
| mechanisms | 364 |
| disease | 358 |
| role | 346 |
| cell | 335 |
| program | 283 |
| hiv | 280 |
| training | 272 |
| cancer | 265 |
| Source: Grant Witness | |
| Terminated NIH Grants | |
| Most Frequent Words in Titles | |
| word | n |
|---|---|
| among | 260 |
| regulation | 229 |
| development | 224 |
| risk | 207 |
| care | 187 |
| function | 182 |
| university | 181 |
| use | 172 |
| human | 168 |
| brain | 165 |
| Source: Grant Witness | |
NSF
NSF_title_words <- df |>
filter(agency == "NSF") |>
select(project_title) |>
tidytext::unnest_tokens(word, project_title) |>
count(word) |>
anti_join(stop_words, by = "word")tab1 <- NSF_title_words |>
arrange(desc(n)) |>
slice(1:10) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated NSF Grants",
subtitle = "Most Frequent Words in Titles"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "springgreen"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "word")
)tab2 <- NSF_title_words |>
arrange(desc(n)) |>
slice(11:20) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated NSF Grants",
subtitle = "Most Frequent Words in Titles"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "springgreen"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "word")
)list(tab1, tab2) |>
gtExtras::gt_two_column_layout()| Terminated NSF Grants | |
| Most Frequent Words in Titles | |
| word | n |
|---|---|
| research | 845 |
| collaborative | 632 |
| stem | 405 |
| career | 211 |
| equity | 200 |
| learning | 177 |
| alliance | 149 |
| engineering | 145 |
| science | 142 |
| education | 141 |
| Source: Grant Witness | |
| Terminated NSF Grants | |
| Most Frequent Words in Titles | |
| word | n |
|---|---|
| faculty | 129 |
| students | 119 |
| community | 113 |
| advance | 107 |
| inclusive | 97 |
| based | 89 |
| participation | 83 |
| project | 82 |
| black | 78 |
| change | 78 |
| Source: Grant Witness | |
Abstracts
NIH
NIH_abstract_words <- df |>
filter(agency == "NIH") |>
select(abstract) |>
tidytext::unnest_tokens(word, abstract) |>
count(word) |>
anti_join(stop_words, by = "word")tab1 <- NIH_abstract_words |>
arrange(desc(n)) |>
slice(1:10) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated NIH Grants",
subtitle = "Most Frequent Words in Abstracts"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "springgreen"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "word")
)tab2 <- NIH_abstract_words |>
arrange(desc(n)) |>
slice(11:20) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated NIH Grants",
subtitle = "Most Frequent Words in Abstracts"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "springgreen"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "word")
)list(tab1, tab2) |>
gtExtras::gt_two_column_layout()| Terminated NIH Grants | |
| Most Frequent Words in Abstracts | |
| word | n |
|---|---|
| research | 11899 |
| health | 8300 |
| aim | 7305 |
| 1 | 6698 |
| 2 | 6580 |
| cell | 6488 |
| project | 6216 |
| data | 5630 |
| cells | 5325 |
| program | 4970 |
| Source: Grant Witness | |
| Terminated NIH Grants | |
| Most Frequent Words in Abstracts | |
| word | n |
|---|---|
| use | 4892 |
| training | 4850 |
| development | 4716 |
| study | 4487 |
| 3 | 4419 |
| specific | 4396 |
| disease | 4239 |
| new | 4052 |
| can | 4040 |
| studies | 3962 |
| Source: Grant Witness | |
NSF
NSF_abstract_words <- df |>
filter(agency == "NSF") |>
select(abstract) |>
tidytext::unnest_tokens(word, abstract) |>
count(word) |>
anti_join(stop_words, by = "word")tab1 <- NSF_abstract_words |>
arrange(desc(n)) |>
slice(1:10) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated NSF Grants",
subtitle = "Most Frequent Words in Abstracts"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "springgreen"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "word")
)tab2 <- NSF_abstract_words |>
arrange(desc(n)) |>
slice(11:20) |>
gt() |>
cols_align(align = "center") |>
tab_footnote(footnote = "Source: Grant Witness") |>
tab_header(
title = "Terminated NSF Grants",
subtitle = "Most Frequent Words in Abstracts"
) |>
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) |>
tab_style(
style = list(cell_fill(color = "springgreen"),
cell_text(color = "#121212",
weight = "bold")),
locations = cells_body(columns = "word")
)list(tab1, tab2) |>
gtExtras::gt_two_column_layout()| Terminated NSF Grants | |
| Most Frequent Words in Abstracts | |
| word | n |
|---|---|
| project | 7422 |
| stem | 7149 |
| research | 7055 |
| students | 5050 |
| support | 3859 |
| education | 2928 |
| program | 2880 |
| science | 2846 |
| using | 2778 |
| learning | 2625 |
| Source: Grant Witness | |
| Terminated NSF Grants | |
| Most Frequent Words in Abstracts | |
| word | n |
|---|---|
| faculty | 2549 |
| impacts | 2512 |
| data | 2507 |
| evaluation | 2419 |
| broader | 2374 |
| award | 2359 |
| engineering | 2357 |
| development | 2208 |
| community | 2174 |
| nsf's | 2102 |
| Source: Grant Witness | |
Word Clouds
While there are programmatic ways to make word clouds, I like the functionality of the WordClouds.com website. To use that third-party software, make a CSV file whose columns are: weight, word, color, url.
NIH
NIH_wordcloud_df <- NIH_abstract_words |>
mutate(weight = n, .before = "word") |>
select(weight, word) |>
arrange(desc(weight)) |>
slice(1:100) |>
mutate(color = ifelse(word %in% banned_words, "#ff0000", ""),
url = "")
readr::write_csv(NIH_wordcloud_df, "NIH_for_wordcloud.csv")
NSF
NSF_wordcloud_df <- NSF_abstract_words |>
mutate(weight = n, .before = "word") |>
select(weight, word) |>
arrange(desc(weight)) |>
slice(1:100) |>
mutate(color = ifelse(word %in% banned_words, "#ff0000", ""),
url = "")
readr::write_csv(NSF_wordcloud_df, "NSF_for_wordcloud.csv")
Reinstatement
Finally, I am curious if some states performed better than others in getting those research grants reinstated. We will seek out the proportion of grants that were reinstated for each state.
Proportion
df_state_group <- df |>
group_by(agency, org_state) |>
mutate(num_grants = n()) |>
ungroup() |>
mutate(reinstated = ifelse(!is.na(reinstatement_ind), FALSE, TRUE)) |>
group_by(agency, org_state) |>
mutate(num_reinstated = sum(reinstated)) |>
ungroup() |>
mutate(prop_reinstated = num_reinstated / num_grants) |>
select(agency, org_state, prop_reinstated) |>
distinct()
shp_and_df <- states_shp |>
left_join(df_state_group, by = join_by(STUSPS == org_state))NIH
shp_and_df |>
filter(agency == "NIH") |>
ggplot() +
geom_sf(aes(fill = prop_reinstated)) +
labs(title = "Reinstated Grants at Universities",
subtitle = "NIH Grants",
caption = "Source: Grant Witness") +
scale_fill_gradient(low = "blue", high = "red") +
theme_minimal()
NSF
shp_and_df |>
filter(agency == "NSF") |>
ggplot() +
geom_sf(aes(fill = prop_reinstated)) +
labs(title = "Reinstated Grants at Universities",
subtitle = "NSF Grants",
caption = "Source: Grant Witness") +
scale_fill_gradient(low = "blue", high = "red") +
theme_minimal()
Coda
sessionInfo()R version 4.5.1 (2025-06-13 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 10 x64 (build 19045)
Matrix products: default
LAPACK version 3.12.1
locale:
[1] LC_COLLATE=English_United States.utf8
[2] LC_CTYPE=English_United States.utf8
[3] LC_MONETARY=English_United States.utf8
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.utf8
time zone: America/New_York
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] lubridate_1.9.4 forcats_1.0.0 stringr_1.5.1 dplyr_1.1.4
[5] purrr_1.1.0 readr_2.1.5 tidyr_1.3.1 tibble_3.3.0
[9] ggplot2_4.0.0 tidyverse_2.0.0 tidytext_0.4.3 sf_1.0-21
[13] gtExtras_0.6.1 gt_1.0.0
loaded via a namespace (and not attached):
[1] gtable_0.3.6 xfun_0.52 htmlwidgets_1.6.4 lattice_0.22-7
[5] paletteer_1.6.0 tzdb_0.5.0 vctrs_0.6.5 tools_4.5.1
[9] generics_0.1.4 parallel_4.5.1 proxy_0.4-27 janeaustenr_1.0.0
[13] pkgconfig_2.0.3 tokenizers_0.3.0 Matrix_1.7-3 KernSmooth_2.23-26
[17] RColorBrewer_1.1-3 S7_0.2.0 lifecycle_1.0.4 compiler_4.5.1
[21] farver_2.1.2 fontawesome_0.5.3 sass_0.4.10 SnowballC_0.7.1
[25] htmltools_0.5.8.1 class_7.3-23 yaml_2.3.10 crayon_1.5.3
[29] pillar_1.11.0 classInt_0.4-11 stopwords_2.3 tidyselect_1.2.1
[33] digest_0.6.37 stringi_1.8.7 rematch2_2.1.2 labeling_0.4.3
[37] fastmap_1.2.0 grid_4.5.1 cli_3.6.5 magrittr_2.0.3
[41] e1071_1.7-16 withr_3.0.2 scales_1.4.0 bit64_4.6.0-1
[45] timechange_0.3.0 rmarkdown_2.29 bit_4.6.0 hms_1.1.3
[49] evaluate_1.0.4 knitr_1.50 rlang_1.1.6 Rcpp_1.1.0
[53] glue_1.8.0 DBI_1.2.3 xml2_1.3.8 rstudioapi_0.17.1
[57] vroom_1.6.5 jsonlite_2.0.0 R6_2.6.1 units_0.8-7