Access Tidy Education Finance Data
Overview
Provides easy access to tidy education finance data using Bellwether's methodology to combine NCES F-33 Survey, Census Bureau Small Area Income Poverty Estimates (SAIPE), community data from the ACS 5-Year Estimates, the Comparable Wage Index for Teachers (CWIFT) from NCES EDGE, and school district land area from U.S. Census Bureau Gazetteer Files. The package simplifies downloading, caching, and filtering education finance data by year and state, enabling researchers and analysts to explore K-12 education funding patterns, revenue sources, expenditure categories, and demographic factors across U.S. school districts.
- **FY2023 data.** Coverage now extends through the 2022-23 school year (fiscal year 2023).
get_finance_data()defaults toyr = "2023"and accepts years 2012-2023 (includingcpi_adjbase years). - **
list_variables()gains anf33_itemcolumn** recording the F-33 survey item(s) each F-33-sourced variable is drawn from (e.g.,"F12","TCAPOUT / V33");NAfor non-F-33 sources and edfinr-adjusted measures. The "Data Sources and Methodology" vignette's crosswalk table is built from it. Also fixes a typo in therev_state_unadjdescription (TSTREV). - **Documentation overhaul.** The "Basic usage" vignette is now the package's "Get started" page. "Capital and Facilities" and "CWIFT" moved to pkgdown-only articles (no longer shipped in the CRAN package), joined by four new articles: "Data Quality and Comparability", "COVID Relief Spending", "Community and Economic Context", and "Mapping School Finance Data". The CRAN vignettes that download hosted data now skip evaluation on CRAN machines.
- **Capital, debt, and fund-balance variables (F-33).** Added 17 columns: total capital outlay (
exp_cap_total,exp_cap_total_pp) and its components (exp_cap_construction,exp_cap_land,exp_cap_equip_instr,exp_cap_equip_other,exp_cap_equip_nonspec), interest on debt (exp_debt_interest), long/short-term debt stocks (debt_lt_begin,debt_lt_issued,debt_lt_retired,debt_lt_end,debt_st_begin,debt_st_end), and fund balances (fund_bal_debt_svc,fund_bal_bond,fund_bal_other).exp_cap_totalandexp_cap_total_ppare in the skinny dataset; the rest are full-only. See the new "Capital and Facilities" vignette. - **CWIFT.** Added the NCES EDGE Comparable Wage Index for Teachers:
cwift_est,cwift_se,cwift_imputed, andcwift_impute_method(cwift_estandcwift_imputedare in the skinny dataset). See the new "CWIFT" vignette. - **District land area and student density (Census Gazetteer).** Added
land_area_sq_miands_per_sq_mi, both in the skinny dataset for all years 2012-2023.land_area_sq_miisNA(neverInf) where land area is zero or the LEA has no Gazetteer boundary (charters, ESAs, state-operated agencies); the Vermont FY2016-FY2021 Act 46 coverage gap leaves match rates in the 7-12% range there versus 97%+ elsewhere. Log scales are recommended when plottings_per_sq_mi. - **Additional ACS and anomaly fields (skinny).**
mean_hhi,gini,owner_pct,snap_pct,unemp_rate, unadjusted per-pupil revenue (rev_state_unadj_pp,rev_local_unadj_pp), raw NCES locale codes (urbanicity_raw,urbanicity_raw_cat), and the state-revenue anomaly fieldsosp_pctandc11_spike_flag. - **State capital/debt revenue exposed (skinny).**
rev_state_cap_debt(F-33 item C11) is the state capital and debt-service revenue netted out ofrev_state, now shipped in both datasets so the state-revenue adjustment can be reconstructed directly alongsiderev_state_unadjandc11_spike_flag. Because it feeds the adjustment arithmetic, it is zero-filled -- notNA-- for non-reporting districts. Use caution comparingrev_state_ppacross years for districts wherec11_spike_flagisTRUE. - **
cpi_adjscope.** Revenue, current/capital expenditure flows,exp_debt_interest, and income variables are adjusted. Debt and fund-balance **stocks** (debt_*,fund_bal_*) and the **CWIFT index** are returned nominal (never CPI-adjusted). - **New dictionary categories.**
list_variables()now includes"debt"and"cwift"categories and lists all 124 variables (59 in the skinny dataset). - **Behavior change: CCD directory attributes now match the labeled fiscal year.** Previous releases joined CCD directory data one school year forward: fiscal year Y rows carried directory attributes (
dist_name,county,state_leaid,cong_dist,urbanicity,urbanicity_raw,urbanicity_raw_cat,lea_type,lea_type_id) from SY Y to Y+1 instead of SY Y-1 to Y. These columns now come from the directory vintage for the same school year, so values change wherever an attribute changed between adjacent years, and FY2023 now uses the final SY 2022-23 directory rather than the SY 2023-24 vintage. The fix also restores the final operating year of districts that closed: those district-years previously had no directory match and were silently dropped by the LEA-type exclusion. Alongside it, the LEA-type screen now tolerates single-vintage agency-type miscodes (a district-year is excluded only if the following directory vintage agrees it is not a regular district, supervisory union, or charter), which keeps real districts -- e.g. all 60 MA regional districts in FY2016, several newly formed AL city districts -- from dropping out of single years. - **Coverage change: MA regional districts restored for FY2012-FY2015.** CCD coded every Massachusetts regional school district as a service agency (
agency_type4) for five consecutive directory vintages, SY 2011-12 through SY 2015-16, with a correction from SY 2016-17 onward. Because the miscode spans adjacent vintages, the single-vintage tolerance above only recovers FY2016; earlier releases had no data for these districts before then. This release restores them for FY2012-FY2015 via an explicit vetted list of 60 NCES LEA IDs: 236 district-years covering roughly 107,000 to 110,000 students per year (57 districts in FY2012 rising to 60 by FY2014 as three newly formed regionals phase in). Restored rows pass all other screens and show clean enrollment continuity into FY2016. Two cautions. First,lea_typeandlea_type_idreport what the source vintage said, so these rows (and the FY2016 rows) carrylea_type_id4 ("Service agency"); filtering MA years 2012-2016 onlea_type_idwill drop real regional districts. Second, MA regional vocational-technical districts remain excluded in every year: F-33 codes their school level 05 from FY2013 onward, outside the panel's elementary/secondary/unified scope. Row counts rise slightly in every year relative to earlier releases, and by an additional 57-60 rows in FY2012-FY2015.
Show all changes in 0.2.0Hide the rest of the changes in 0.2.0
- **Behavior change:
exp_cur_totalis now sourced from TCURELSC.** In 0.1.x the total was the sum of the ESSA fund-type items (CE1 + CE2 + CE3).exp_cur_total,exp_cur_pp, andrev_exp_pp_diffare now available for nearly all districts in all years 2012-2023. Values shift slightly where both were reported (the ESSA items exclude payments to private, charter, and other school systems, so the CE-sum differs from TCURELSC by more than 2% for roughly 40% of reporting districts). The CE-based columns remain available asexp_cur_st_loc,exp_cur_fed, andexp_cur_resa,NAwhere states did not report them; missing values still propagate toNArather than zero. - **Behavior change: flagged zero-filled missing values are now
NA.** F-33 zero-fills some unreported items instead of using its-1missing code, marking them with anFL_* = "M"data-item flag. The cleaning pipeline now applies those flags to the COVID (exp_covid_*), capital-detail, debt, fund-balance, CE fund-type, and expenditure-detail columns. Most visibly, COVID relief spending isNA-- not $0 -- for all New York districts (including NYC) in every year and for roughly a third to half of California districts from FY21 onward. Genuine reported zeros are unchanged, and column sums are unaffected (only zero-filled values becameNA; the small number of cells carrying real values under a missing/not-applicable flag are retained). The revenue-adjustment inputs are deliberately excluded, so adjusted revenue coverage is unchanged;osp_pctand theexp_pay_*columns retain zero-filled values where states did not report (see the cleaning-repo README). - **Hosted data format.** The hosted datasets are now gzip-compressed Parquet (read with
nanoparquet) instead of.rds. This is transparent to callers. - **Per-year downloads.**
get_finance_data()now downloads only the requested year(s) -- each year is a separate hosted file of roughly 3-6 MB -- so single-year and short-range requests transfer far less than the full panel.yr = "all"still fetches the entire history from one combined file. - **Download robustness.** Downloads now go to a temporary file that is renamed into the session cache only on success, so an interrupted transfer can no longer leave a partial file behind that later calls treat as cached. The download timeout is temporarily raised to at least 600 seconds during transfers (R's 60-second default cannot complete the 38-54 MB
yr = "all"files on slower connections); a higher user-setoptions(timeout = )is respected. A cached file that fails to read is deleted with a clear message instead of failing on every subsequent call, and download failures now carry the condition classedfinr_download_error. - **Friendlier input handling.**
geovalues are whitespace-trimmed and"all"is case-insensitive, sogeo = "KY, OH"andgeo = "All"work; vector orNAarguments produce clear errors naming the argument instead of raw R errors; andlist_variables()rejects an unknowncategoryinstead of silently returning zero rows.
From NEWS.md in the release
Install
Health
- OK13 OK2026-08-05
- NOTE12 OK, 1 NOTE2026-08-01
- OK13 OK2026-07-04
- ERROR12 OK, 1 ERROR2026-07-03
- OK13 OK2026-05-21
Show 2 earlier changesHide 2 earlier changes
- ERROR12 OK, 1 ERROR2026-05-20
- OK14 OK2026-03-10
Documentation
The repository also keeps web-only articles.
- Help pages
- 7 (4 internal)
- Examples that run
- 100%3 run in a plain check
- Exported functions with examples
- 100%
- Documented parameters
- 100%
- Return-value docs
- 100%
- Help pages citing references
- 0%
Downloads
Repository
- PRs merged (all time)
- 100%
- Median days to close, 50 most recently updated closed issues
- 8
- Median days to close, 50 most recently updated closed PRs
- 0
Stars over time
Commits over time
7 development-tooling and community-health practices detected across 4 families in the upstream repository
Checks run against github.com/bellwetherorg/edfinr on 2026-10-22.
The R CMD check workflow runs on Linux, macOS and Windows, and on R-devel
GitHub Pages site last deployed 2026-08-21 · The repository has a site deploy workflow
pkgdown site last built 2026-08-21
This repository shows signs of AI coding tools.
- Claude Codefirst seen 2026-07-21Named in .Rbuildignore: .claudeCommits: at least 1 crediting it in the message
- Claude Fable 51 commit · Jul 2026
Dependencies
Installing edfinr adds 16 packages (10 with compiled code, 6.3 MB of source tarballs). Heaviest: nanoparquet 1.1 MB, vctrs 1.0 MB, dplyr 902 KB.
Code & Tests
People & History
Pick two releases to compare their code metrics.
- 0.2.0Latest
- RR 4.6.0 released · 2026-04-24
- 0.1.12025-08-26
- RR 4.5.0 released · 2025-04-11
Package metadata
- First published
- 2025-08-26
- Total releases
- 2 / 1 yrs
- License
- CC BY 4.0
- Minimum R
- ≥ 4.1.0
- Download size
- 418 KB
Cite
Cite this package
Run in R for the authors' preferred citation:
citation("edfinr")This package has no citation file, so citation() returns this entry built from DESCRIPTION.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-25, which the citation names so these numbers can be found later. More on citing and the projects behind them.