Skip to contents

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

Installation

R

# install.packages("devtools")
devtools::install_github("almartin82/rischooldata")

Python

pip install git+https://github.com/almartin82/rischooldata.git#subdirectory=pyrischooldata

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     135978

Python

import pyrischooldata as ri

# Get 2025 enrollment data (2024-25 school year)
enr = ri.fetch_enr(2025)

# Statewide total
state_total = enr[(enr['is_state'] == True) &
                  (enr['subgroup'] == 'total_enrollment') &
                  (enr['grade_level'] == 'TOTAL')]
print(state_total['n_students'].values[0])
#> 135978

Highlights

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
White vs Hispanic enrollment share
White vs Hispanic enrollment share

(source)


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
English learners statewide trend
English learners statewide trend

(source)


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
Charter school enrollment growth
Charter school enrollment growth

(source)


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

Census Day

All enrollment counts are from the October 1st official count date (fall census).

Known Data Quality Issues

  1. 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.
  2. Historical format differences: Era 1 (2011-2014) data may have different column formats than modern data. State-level demographics are not available for 2011.
  3. Charter reporting: Charter schools are reported as separate districts, not under the sending district.
  4. 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
Rhode Island statewide enrollment trend
Rhode Island statewide enrollment trend

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
Top 10 Rhode Island districts by enrollment
Top 10 Rhode Island districts by enrollment

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  -3705

7. 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
Rhode Island student demographics
Rhode Island student demographics

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   -123

9. 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
Kindergarten enrollment trend
Kindergarten enrollment trend

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+)     2

11. 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
Cranston vs Warwick enrollment
Cranston vs Warwick enrollment

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
Special education enrollment rate
Special education enrollment rate

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
Urban district enrollment comparison
Urban district enrollment comparison

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
Newport enrollment trend
Newport enrollment trend

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
Regional enrollment comparison
Regional enrollment comparison