Grant Witness

Author

Derek Sollberger

Published

January 12, 2026

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

  1. epa_terminations.csv
  2. nih_terminations.csv
  3. nsf_terminations.csv

which refer to the EPA (Environmental Protection Agency), NIH (National Institutes of Health), and NSF (National Science Foundation) respectively.

library("gt")
library("gtExtras")
library("sf")
library("tidytext")
library("tidyverse")

stop_words <- tidytext::get_stopwords()
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"                    

https://grantwritingandfunding.com/banned-and-trigger-words-in-federal-grant-writing-in-the-trump-administration-2-0/

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")

NIH Abstracts

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")

NSF Abstracts

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