dplyr functions
Verification
Scope
Single-table functions, window and summary helpers, expressions, grouping, joins, join_by() conditions, set operations, and rows_*(). Output tables compared with dplyr's.
References
- Reference
- R 4.6.1 with dplyr 1.2.1
- Versions
- R 4.6.1, dplyr 1.2.1, PHP 8.5.10, phibble v0.8.0 (9e63ca5)
Data
- panel.csv
- 12 rows: id, g, year, value, score, label. Source
- schools.csv
- 250 rows: school, study_hours, prior_score, score. Source
- housing.csv
- 8 rows: area_m2, bedrooms, monthly_rent. Source
- join_x.csv
- 5 rows: id, k, v. Source
- join_y.csv
- 5 rows: key, k, w. Source
- events.csv
- 5 rows: id, t, amount. Source
- periods.csv
- 5 rows: id, start, end, label. Source
- Inline tables
- Defined in tests/r/groups.R, tests/r/rows.R, and the matching PHP tests.
Method
Reference results computed in R by tests/r/reference.R, expr.R, groups.R, joins.R, join_by.R, and rows.R and stored in tests/Fixtures/. The same operations run in phplyr in the Pest tests that read those fixtures, which compare every value. Values compared is the number of assertions in a case; a case fails if any assertion fails.
- Check
- Comparison with a reference implementation
- Recorded
- 2026-11-02, PHP 8.5.10, macOS (arm64), commit 65e6a46
Tolerances
|x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1)
Applies to: Floating-point values
exact equality
Applies to: Column names, row counts and order, strings, integers, booleans, dates, and missing values
x: package value; r: reference value. Absolute error: |x − r|. Relative error: |x − r| / max(|r|, 1). Max errors are over the values a row compares.
Results
79 comparisons: 79 pass, 0 fail, 0 skipped.
All 79 comparisons
| Case | Quantity | Criterion | Values | Max abs. error | Max rel. error | Status |
|---|---|---|---|---|---|---|
| windows | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 277 | 2.7e-15 | 6.1e-16 | pass |
| ntile_all | Values | exact equality | 49 | pass | ||
| vectors | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 145 | 2.7e-15 | 5.2e-16 | pass |
| filter_group_max | Values | exact equality | 17 | pass | ||
| filter_between | Values | exact equality | 11 | pass | ||
| filter_if_any | Values | exact equality | 7 | pass | ||
| filter_if_all | Values | exact equality | 9 | pass | ||
| filter_by | Values | exact equality | 13 | pass | ||
| across_mean | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 13 | 2.7e-15 | 5.4e-16 | pass |
| across_list | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 19 | 2.7e-15 | 5.4e-16 | pass |
| across_names | Values | exact equality | 13 | pass | ||
| across_mutate | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 49 | 0 | 0 | pass |
| across_mutate_window | Values | exact equality | 49 | pass | ||
| transmute | Values | exact equality | 49 | pass | ||
| keep_none | Values | exact equality | 37 | pass | ||
| add_count | Values | exact equality | 37 | pass | ||
| tally | Values | exact equality | 10 | pass | ||
| count_wt | Values | exact equality | 10 | pass | ||
| add_tally | Values | exact equality | 37 | pass | ||
| slice_min | Values | exact equality | 11 | pass | ||
| slice_min_noties | Values | exact equality | 7 | pass | ||
| slice_max | Values | exact equality | 13 | pass | ||
| slice_max_prop | Values | exact equality | 7 | pass | ||
| slice_tail | Values | exact equality | 13 | pass | ||
| slice_pos | Values | exact equality | 13 | pass | ||
| slice_neg | Values | exact equality | 19 | pass | ||
| slice_head_by | Values | exact equality | 7 | pass | ||
| distinct_keep_all | Values | exact equality | 10 | pass | ||
| distinct_computed | Values | exact equality | 5 | pass | ||
| reframe | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 25 | 0 | 0 | pass |
| summarise_by | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 13 | 0 | 0 | pass |
| arrange_expr | Values | exact equality | 25 | pass | ||
| arrange_by_group | Values | exact equality | 25 | pass | ||
| Matches dplyr on output that depends on sorted group keys | Values | exact equality | 90 | pass | ||
| Selects columns like tidyselect | Values | exact equality | 15 | pass | ||
| Reports groups like dplyr | Values | exact equality | 4 | pass | ||
| Matches dplyr for a grouped summary | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 242 | 5.7e-14 | 9.4e-16 | pass |
| Matches dplyr count with sort | Values | exact equality | 8 | pass | ||
| Matches dplyr for a grouped mutate | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 153 | 4.6e-14 | 4.6e-15 | pass |
| Matches dplyr for mutate, rename, select and arrange | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 33 | 3.9e-14 | 1.5e-15 | pass |
| Matches dplyr distinct | Values | exact equality | 7 | pass | ||
| Matches dplyr for mutate keep used and unused | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 209 | 0 | 0 | pass |
| Matches R for scalar expression helpers | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 97 | 4.9e-15 | 2.7e-15 | pass |
| Matches dplyr for equality join_by() | Values | exact equality | 43 | pass | ||
| Inequality, rolling and overlap joins: ineq | Values | exact equality | 29 | pass | ||
| Inequality, rolling and overlap joins: ineq_left | Values | exact equality | 36 | pass | ||
| Inequality, rolling and overlap joins: between | Values | exact equality | 36 | pass | ||
| Inequality, rolling and overlap joins: closest | Values | exact equality | 36 | pass | ||
| Inequality, rolling and overlap joins: closest_lt | Values | exact equality | 41 | pass | ||
| Inequality, rolling and overlap joins: within | Values | exact equality | 91 | pass | ||
| Inequality, rolling and overlap joins: overlaps | Values | exact equality | 208 | pass | ||
| Inequality, rolling and overlap joins: semi | Values | exact equality | 13 | pass | ||
| Inequality, rolling and overlap joins: anti | Values | exact equality | 9 | pass | ||
| Inequality, rolling and overlap joins: keep_true | Values | exact equality | 41 | pass | ||
| Joins: left | Values | exact equality | 43 | pass | ||
| Joins: inner | Values | exact equality | 37 | pass | ||
| Joins: right | Values | exact equality | 43 | pass | ||
| Joins: full | Values | exact equality | 49 | pass | ||
| Joins: keep | Values | exact equality | 50 | pass | ||
| Joins: first | Values | exact equality | 31 | pass | ||
| Joins: last | Values | exact equality | 31 | pass | ||
| Joins: never | Values | exact equality | 43 | pass | ||
| Joins: semi | Values | exact equality | 17 | pass | ||
| Joins: anti | Values | exact equality | 5 | pass | ||
| Joins: anti_never | Values | exact equality | 9 | pass | ||
| Joins: cross | Values | exact equality | 76 | pass | ||
| Joins: suffix | Values | exact equality | 37 | pass | ||
| Joins: by_k | Values | exact equality | 25 | pass | ||
| Joins: natural | Values | exact equality | 16 | pass | ||
| Joins: two_keys | Values | exact equality | 26 | pass | ||
| Joins: key_clash | Values | exact equality | 36 | pass | ||
| Joins: rowwise_sum | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 13 | 0 | 0 | pass |
| Joins: rowwise_mutate | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 13 | 0 | 0 | pass |
| Matches dplyr cur_group_id() and cur_group_rows() | Values | exact equality | 134 | pass | ||
| Keeps empty factor-level groups with _drop: false | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 41 | 0 | 0 | pass |
| Matches dplyr set operations | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 67 | 0 | 0 | pass |
| Matches dplyr rows_*() | Table values | |x − r| ≤ 1e-9 + 1e-9 × max(|r|, 1) | 92 | 0 | 0 | pass |
| Matches case_match and group_cols | Values | exact equality | 38 | pass | ||
| Matches dplyr 1.2 additions | Values | exact equality | 189 | pass |
Reproduction
Rscript tests/r/reference.R
Rscript tests/r/expr.R
Rscript tests/r/groups.R
Rscript tests/r/joins.R
Rscript tests/r/join_by.R
Rscript tests/r/rows.R
bin/site-verifications
- Raw record
- site/verifications/dplyr.json
- Input data
- tests/Fixtures