Fetch and analyze Rhode Island school enrollment data from the Rhode Island Department of Education (RIDE) in R or Python. America’s smallest state is on the cusp of a demographic milestone: white students hold just a 50.3% majority while English learners have tripled in a decade.
Part of the njschooldata family.
Full documentation — all 15 stories with interactive charts, getting-started guide, and complete function reference.
Data Taxonomy
| Category | Years | Function | Details |
|---|---|---|---|
| Enrollment | 2011-2025 |
fetch_enr() / fetch_enr_multi()
|
State, district, school. Race, gender, FRPL, SpEd, LEP |
| Assessments | — | — | Not yet available |
| Graduation | — | — | Not yet available |
| Directory | Current | fetch_directory() |
437 public schools. Address, phone, grades, principal, charter/Title I flags |
| Per-Pupil Spending | — | — | Not yet available |
| Accountability | — | — | Not yet available |
| Chronic Absence | — | — | Not yet available |
| EL Progress | — | — | Not yet available |
| Special Ed | — | — | Not yet available |
See the full data category taxonomy
Quick Start
R
library(rischooldata)
library(dplyr)
# Fetch 2025 enrollment data (2024-25 school year)
enr_2025 <- fetch_enr(2025, use_cache = TRUE)
# State total
enr_2025 |>
filter(is_state, subgroup == "total_enrollment", grade_level == "TOTAL") |>
select(n_students)
#> # A tibble: 1 x 1
#> n_students
#> <dbl>
#> 1 135978Highlights
library(rischooldata)
library(dplyr)
library(tidyr)
library(ggplot2)
theme_set(theme_minimal(base_size = 14))
enr <- fetch_enr_multi(2012:2025, use_cache = TRUE)
enr_2025 <- fetch_enr(2025, use_cache = TRUE)1. White students narrowly hold majority at 50.3%
Rhode Island is on the cusp of a demographic milestone – white students still hold a slim majority at 50.3%, but Hispanic enrollment has grown from 21.6% to 30.7% since 2012.
race_trends <- enr |>
filter(is_state, grade_level == "TOTAL",
subgroup %in% c("white", "hispanic")) |>
select(end_year, subgroup, pct) |>
mutate(pct = round(pct * 100, 1)) |>
pivot_wider(names_from = subgroup, values_from = pct)
stopifnot(nrow(race_trends) > 0)
race_trends
#> # A tibble: 14 x 3
#> end_year hispanic white
#> <int> <dbl> <dbl>
#> 1 2012 21.6 64.0
#> 2 2013 22.4 62.8
#> 3 2014 23.4 61.5
#> 4 2015 23.6 60.7
#> 5 2016 24.2 59.7
#> 6 2017 24.7 58.7
#> 7 2018 25.3 57.7
#> 8 2019 26.1 56.6
#> 9 2020 27.1 55.2
#> 10 2021 27.8 54.2
#> 11 2022 28.7 53.2
#> 12 2023 29.5 52.3
#> 13 2024 30.5 51.1
#> 14 2025 30.7 50.3
2. English learners tripled statewide since 2012
Rhode Island’s English learner population surged from 5.9% to 15.0% of enrollment between 2012 and 2025 – a statewide transformation driven by immigration.
lep_trend <- enr |>
filter(is_state, grade_level == "TOTAL", subgroup == "lep") |>
select(end_year, n_students, pct) |>
mutate(pct = round(pct * 100, 1))
stopifnot(nrow(lep_trend) > 0)
lep_trend
#> # A tibble: 14 x 3
#> end_year n_students pct
#> <int> <dbl> <dbl>
#> 1 2012 8436 5.9
#> 2 2013 8913 6.3
#> 3 2014 8980 6.3
#> 4 2015 9643 6.8
#> 5 2016 10341 7.3
#> 6 2017 10888 7.7
#> 7 2018 12629 8.8
#> 8 2019 14138 9.9
#> 9 2020 15377 10.7
#> 10 2021 15084 10.8
#> 11 2022 15721 11.3
#> 12 2023 17226 12.5
#> 13 2024 18422 13.5
#> 14 2025 20352 15.0
3. Charter schools serve 13,000+ students across 25 schools
Rhode Island’s charter sector has grown from 3,705 students in 2012 to 13,078 in 2025, now serving 9.6% of all public school students.
charters <- enr_2025 |>
filter(is_charter, is_district, subgroup == "total_enrollment", grade_level == "TOTAL") |>
summarize(
n_charters = n(),
total_students = sum(n_students, na.rm = TRUE)
)
stopifnot(nrow(charters) > 0)
charters
#> # A tibble: 1 x 2
#> n_charters total_students
#> <int> <dbl>
#> 1 25 13078
Explore More
Full analysis with 15 stories: - 15 Insights from Rhode Island School Enrollment Data – 15 stories - Function reference
Data Notes
Data Source: Rhode Island Department of Education (RIDE) Data Center URL: https://datacenter.ride.ri.gov/ Report: October 1st Public School Student Headcounts
Available Years
| Era | Years | Format |
|---|---|---|
| Historical | 2011-2014 | Excel (.xlsx) |
| Current | 2015-2025 | Excel (.xlsx) |
15 years of enrollment totals across 64 districts and 307 schools. State-level demographics available from 2012 onward.
Suppression Rules
- RIDE does not publish counts under 10 students (displayed as
*) - This package returns suppressed values as
NA
Known Data Quality Issues
- RIDE API limitations: As of late 2024, the RIDE Data Center requires JavaScript-based downloads. The package uses bundled data files as the primary source with network download as fallback.
- Historical format differences: Era 1 (2011-2014) data may have different column formats than modern data. State-level demographics are not available for 2011.
- Charter reporting: Charter schools are reported as separate districts, not under the sending district.
- District-level demographics: Bundled data includes demographics at the state level only. District and school records include total enrollment only.
Deeper Dive
4. Rhode Island lost 7,815 students since 2011
Rhode Island’s public school enrollment hovered near 143,000 students from 2011 through 2020, then COVID triggered a sharp drop that the state has not recovered from.
enr_2011 <- fetch_enr(2011, use_cache = TRUE)
state_totals <- bind_rows(
enr_2011 |>
filter(is_state, subgroup == "total_enrollment", grade_level == "TOTAL") |>
select(end_year, n_students),
enr |>
filter(is_state, subgroup == "total_enrollment", grade_level == "TOTAL") |>
select(end_year, n_students)
) |>
arrange(end_year) |>
mutate(change = n_students - lag(n_students),
pct_change = round(change / lag(n_students) * 100, 2))
stopifnot(nrow(state_totals) > 0)
state_totals
#> # A tibble: 15 x 4
#> end_year n_students change pct_change
#> <dbl> <dbl> <dbl> <dbl>
#> 1 2011 143793 NA NA
#> 2 2012 142854 -939 -0.65
#> 3 2013 142481 -373 -0.26
#> 4 2014 142008 -473 -0.33
#> 5 2015 141959 -49 -0.03
#> 6 2016 142014 55 0.04
#> 7 2017 142150 136 0.1
#> 8 2018 142949 799 0.56
#> 9 2019 143436 487 0.34
#> 10 2020 143557 121 0.08
#> 11 2021 139184 -4373 -3.05
#> 12 2022 138566 -618 -0.44
#> 13 2023 137449 -1117 -0.81
#> 14 2024 136154 -1295 -0.94
#> 15 2025 135978 -176 -0.13
5. Providence dominates, serving 15% of students
Providence is Rhode Island’s largest district by far, enrolling over 20,000 students–about one in seven Rhode Island students.
enr_2025 <- fetch_enr(2025, use_cache = TRUE)
top_districts <- enr_2025 |>
filter(is_district, subgroup == "total_enrollment", grade_level == "TOTAL") |>
arrange(desc(n_students)) |>
head(10) |>
select(district_name, n_students)
stopifnot(nrow(top_districts) > 0)
top_districts
#> # A tibble: 10 x 2
#> district_name n_students
#> <chr> <dbl>
#> 1 Providence 20250
#> 2 Cranston 10037
#> 3 Warwick 7853
#> 4 Pawtucket 7816
#> 5 Woonsocket 5541
#> 6 East Providence 5225
#> 7 Cumberland 4881
#> 8 Coventry 4056
#> 9 North Kingstown 3786
#> 10 North Providence 3488
6. Providence lost 3,705 students since 2019
Providence lost nearly 4,000 students between 2019 and 2025, a 15% decline driven by pandemic disruption and demographic shifts.
covid_enr <- fetch_enr_multi(2019:2025, use_cache = TRUE)
providence_trend <- covid_enr |>
filter(district_name == "Providence", is_district,
subgroup == "total_enrollment", grade_level == "TOTAL") |>
select(end_year, n_students) |>
mutate(change = n_students - first(n_students))
stopifnot(nrow(providence_trend) > 0)
providence_trend
#> # A tibble: 7 x 3
#> end_year n_students change
#> <int> <dbl> <dbl>
#> 1 2019 23955 0
#> 2 2020 23836 -119
#> 3 2021 22440 -1515
#> 4 2022 21656 -2299
#> 5 2023 20725 -3230
#> 6 2024 19856 -4099
#> 7 2025 20250 -37057. Hispanic students now 31% of enrollment
Rhode Island’s Hispanic population has grown dramatically, from 22% in 2012 to nearly 31% today, making it one of the fastest-growing demographic groups in the state.
demographics <- enr_2025 |>
filter(is_state, grade_level == "TOTAL",
subgroup %in% c("white", "black", "hispanic", "asian", "multiracial")) |>
mutate(pct = round(pct * 100, 1)) |>
select(subgroup, n_students, pct) |>
arrange(desc(n_students))
stopifnot(nrow(demographics) > 0)
demographics
#> # A tibble: 5 x 3
#> subgroup n_students pct
#> <chr> <dbl> <dbl>
#> 1 white 68431 50.3
#> 2 hispanic 41785 30.7
#> 3 black 12818 9.4
#> 4 multiracial 7273 5.3
#> 5 asian 4391 3.2
8. Central Falls enrollment held steady despite statewide decline
While Rhode Island lost students statewide, tiny Central Falls – one of the nation’s poorest cities – maintained enrollment near 2,600 students, reflecting its role as a gateway community for immigrant families.
cf_trend <- fetch_enr_multi(2015:2025, use_cache = TRUE) |>
filter(grepl("Central Falls", district_name), is_district,
subgroup == "total_enrollment", grade_level == "TOTAL") |>
select(end_year, n_students) |>
mutate(change = n_students - first(n_students))
stopifnot(nrow(cf_trend) > 0)
cf_trend
#> # A tibble: 11 x 3
#> end_year n_students change
#> <int> <dbl> <dbl>
#> 1 2015 2683 0
#> 2 2016 2657 -26
#> 3 2017 2589 -94
#> 4 2018 2518 -165
#> 5 2019 2695 12
#> 6 2020 2878 195
#> 7 2021 2780 97
#> 8 2022 2701 18
#> 9 2023 2596 -87
#> 10 2024 2539 -144
#> 11 2025 2560 -1239. Kindergarten enrollment down 12% since 2012
After sharp COVID-era drops, kindergarten enrollment has continued to decline rather than recovering, suggesting a longer-term demographic shift beyond pandemic effects.
k_trend <- enr |>
filter(is_state, subgroup == "total_enrollment", grade_level == "K") |>
select(end_year, n_students) |>
mutate(change = n_students - first(n_students))
stopifnot(nrow(k_trend) > 0)
k_trend
#> # A tibble: 14 x 3
#> end_year n_students change
#> <int> <dbl> <dbl>
#> 1 2012 10164 0
#> 2 2013 10786 622
#> 3 2014 10490 326
#> 4 2015 9885 -279
#> 5 2016 9897 -267
#> 6 2017 10059 -105
#> 7 2018 10006 -158
#> 8 2019 10004 -160
#> 9 2020 10038 -126
#> 10 2021 8948 -1216
#> 11 2022 9692 -472
#> 12 2023 9432 -732
#> 13 2024 9201 -963
#> 14 2025 8960 -1204
10. 64 districts in America’s smallest state
Rhode Island reports 64 districts (including charter schools), with sizes ranging from Providence’s 20,250 students to New Shoreham’s 126.
size_buckets <- enr_2025 |>
filter(is_district, subgroup == "total_enrollment", grade_level == "TOTAL") |>
mutate(size_bucket = case_when(
n_students < 1000 ~ "Small (<1K)",
n_students < 5000 ~ "Medium (1K-5K)",
n_students < 10000 ~ "Large (5K-10K)",
TRUE ~ "Very Large (10K+)"
)) |>
count(size_bucket) |>
mutate(size_bucket = factor(size_bucket, levels = c("Small (<1K)", "Medium (1K-5K)", "Large (5K-10K)", "Very Large (10K+)")))
stopifnot(nrow(size_buckets) > 0)
size_buckets
#> # A tibble: 4 x 2
#> size_bucket n
#> <fct> <int>
#> 1 Large (5K-10K) 4
#> 2 Medium (1K-5K) 26
#> 3 Small (<1K) 32
#> 4 Very Large (10K+) 211. Cranston pulls away from Warwick
Cranston and Warwick were Rhode Island’s largest suburban districts at similar sizes in 2011, but Cranston has held enrollment better, opening a 2,184-student gap by 2025.
warwick_cranston <- fetch_enr_multi(2012:2025, use_cache = TRUE) |>
filter(district_name %in% c("Warwick", "Cranston"), is_district,
subgroup == "total_enrollment", grade_level == "TOTAL") |>
select(end_year, district_name, n_students)
stopifnot(nrow(warwick_cranston) > 0)
warwick_cranston |>
tidyr::pivot_wider(names_from = district_name, values_from = n_students)
#> # A tibble: 14 x 3
#> end_year Cranston Warwick
#> <int> <dbl> <dbl>
#> 1 2012 10683 9977
#> 2 2013 10664 9675
#> 3 2014 10552 9393
#> 4 2015 10457 9277
#> 5 2016 10441 9140
#> 6 2017 10415 9124
#> 7 2018 10364 8953
#> 8 2019 10479 8800
#> 9 2020 10475 8610
#> 10 2021 10403 8140
#> 11 2022 10258 8168
#> 12 2023 10225 8005
#> 13 2024 10126 7914
#> 14 2025 10037 7853
12. Special education rate surged to 18.5%
Rhode Island’s special education identification rate has climbed from 15.8% in 2012 to 18.5% in 2025 – well above the national average of about 15%.
sped_trends <- enr |>
filter(is_state, grade_level == "TOTAL", subgroup == "special_ed") |>
select(end_year, n_students, pct) |>
mutate(pct = round(pct * 100, 1))
stopifnot(nrow(sped_trends) > 0)
sped_trends
#> # A tibble: 14 x 3
#> end_year n_students pct
#> <int> <dbl> <dbl>
#> 1 2012 22510 15.8
#> 2 2013 21994 15.4
#> 3 2014 21434 15.1
#> 4 2015 21308 15.0
#> 5 2016 21714 15.3
#> 6 2017 21685 15.3
#> 7 2018 21659 15.2
#> 8 2019 22417 15.6
#> 9 2020 22517 15.7
#> 10 2021 22427 16.1
#> 11 2022 22083 15.9
#> 12 2023 22950 16.7
#> 13 2024 23711 17.4
#> 14 2025 25140 18.5
13. Pawtucket holds its ground as the 4th-largest district
Pawtucket often gets overlooked between Providence and Central Falls, but with 7,816 students it is Rhode Island’s 4th-largest district and a key urban center.
pawtucket_trend <- fetch_enr_multi(2015:2025, use_cache = TRUE) |>
filter(grepl("Pawtucket", district_name), is_district,
subgroup == "total_enrollment", grade_level == "TOTAL") |>
select(end_year, n_students) |>
mutate(change = n_students - first(n_students))
stopifnot(nrow(pawtucket_trend) > 0)
pawtucket_trend
#> # A tibble: 11 x 3
#> end_year n_students change
#> <int> <dbl> <dbl>
#> 1 2015 9057 0
#> 2 2016 9022 -35
#> 3 2017 8984 -73
#> 4 2018 8738 -319
#> 5 2019 8824 -233
#> 6 2020 8784 -273
#> 7 2021 8450 -607
#> 8 2022 8127 -930
#> 9 2023 8056 -1001
#> 10 2024 7887 -1170
#> 11 2025 7816 -1241
14. Newport lost 277 students since 2015
Newport’s famous tourism economy masks significant educational challenges – the district has lost 13% of its enrollment since 2015.
newport_trend <- fetch_enr_multi(2015:2025, use_cache = TRUE) |>
filter(grepl("Newport", district_name), is_district,
subgroup == "total_enrollment", grade_level == "TOTAL") |>
select(end_year, n_students) |>
mutate(change = n_students - first(n_students))
stopifnot(nrow(newport_trend) > 0)
newport_trend
#> # A tibble: 11 x 3
#> end_year n_students change
#> <int> <dbl> <dbl>
#> 1 2015 2072 0
#> 2 2016 2173 101
#> 3 2017 2198 126
#> 4 2018 2237 165
#> 5 2019 2156 84
#> 6 2020 2154 82
#> 7 2021 1995 -77
#> 8 2022 1975 -97
#> 9 2023 1906 -166
#> 10 2024 1856 -216
#> 11 2025 1795 -277
15. Providence Metro shrank 13% while East Bay held steady
The East Bay communities (Barrington, Bristol Warren) have held enrollment relatively steady while Providence Metro districts (Providence, Pawtucket, Central Falls) declined sharply since 2015.
regions <- enr_2025 |>
filter(is_district, subgroup == "total_enrollment", grade_level == "TOTAL") |>
mutate(region = case_when(
district_name %in% c("Barrington", "Bristol Warren") ~ "East Bay",
district_name %in% c("Providence", "Pawtucket", "Central Falls") ~ "Providence Metro",
district_name %in% c("Warwick", "Cranston", "West Warwick") ~ "Central RI",
TRUE ~ "Other"
)) |>
filter(region != "Other") |>
group_by(region) |>
summarize(total_students = sum(n_students, na.rm = TRUE), .groups = "drop")
stopifnot(nrow(regions) > 0)
regions
#> # A tibble: 3 x 2
#> region total_students
#> <chr> <dbl>
#> 1 Central RI 21359
#> 2 East Bay 5987
#> 3 Providence Metro 30626