Transform and combine exact relations
Validate, join, aggregate, derive, and present exact relational data.
Keep exact cells through a relation
The relation validates its schema without turning rational values into binary floating point. Transformations return new relations, so the original remains available.
Project chooses and orders columns explicitly. Rows returns row maps when you need to inspect the transformed semantic value rather than its Table view.
Relations can go directly to the CSV renderer without passing through a Table or losing exact values.
Join and aggregate
Join keys are explicit. A full join retains unmatched rows, while grouping and aggregation keep rational totals and means exact.
Make missing values and finite sources explicit
Missing never guesses a policy. RowSource is pull-based and capped by maxRows; Collect may impose a smaller cap.
Preserve interval-valued measurements
An Interval column keeps bounded measurement uncertainty through exact grouped aggregation. The result encloses every total, mean, minimum, and maximum consistent with the input rows.
Rename and Distinct support cleaning, while Frequency and Contingency produce the standard categorical summaries.
Stream exact JSON Lines without float conversion
JSONL stores one independent JSON object per physical line. ParseJSONL returns a bounded pull source: it scans line locations up front but parses only records requested by Collect or a streaming renderer. Exact numeric cells use tags instead of JSON numbers.
Malformed records report their physical line. blankLines=:error is available when blank lines should invalidate an interchange file; the default :skip policy is convenient for hand-authored teaching data.