phibble

Expressions

Verification

Scope

Results of mutate(), grouped mutate(), and grouped summarise() expressions on all five backends: arithmetic, comparison and logic with NA, conditionals, rounding, strings, offsets, ranks, cumulative functions, and aggregates.

References

Reference
dplyr 1.2.1 and stringr 1.6.0, on R 4.6.1
Versions
R 4.6.1, dplyr 1.2.1, stringr 1.6.0, jsonlite 2.0.0, PHP 8.5.10, SQLite 3.45.2, PostgreSQL 17.0 (Laravel Herd), MySQL 8.0.46, php_polars 0.1.0

Data

expression cases
7 rows, NA in every column Source

Method

tests/r/expr.R evaluates each expression with dplyr on a 7-row table and writes the results. The PHP tests evaluate the same expressions on the same table in each backend. Fixtures regenerated with the listed R versions on 2026-11-01; output byte-identical to the committed files.

Check
Comparison with a reference implementation
Recorded
2026-11-02, PHP 8.5.10, macOS 27.0.1 (arm64), commit 1abdeb1

Tolerances

exact equality

Applies to: Column values

Numbers rounded to 9 decimal places with PHP round() on both sides, Inf, -Inf, and NaN read as NA, and NA in identical positions

exact equality

Applies to: Polars column values

As above, with no fallback to a DataFrame

x: package value; r: reference value.

Results

337 comparisons in 86 cases: 337 pass, 0 fail, 0 skipped.

By case

Results by case
Case Comparisons Status
arith 5 pass
div 5 pass
mod 5 pass
pow 5 pass
cmp 5 pass
and 5 pass
or 5 pass
not 5 pass
is_na 5 pass
if_else 5 pass
case_when 5 pass
coalesce 5 pass
in_ 5 pass
between 5 pass
na_if 5 pass
round 2 pass
log 5 pass
str_lower 5 pass
str_length 5 pass
str_trim 5 pass
str_sub 5 pass
str_sub_neg 5 pass
str_detect 5 pass
str_replace 5 pass
str_replace_all 5 pass
paste0 5 pass
paste 5 pass
as_string 5 pass
lag 5 pass
lead2 5 pass
lag_order 5 pass
row_number 5 pass
row_number_desc 5 pass
min_rank 5 pass
dense_rank 5 pass
percent_rank 5 pass
cume_dist 5 pass
ntile 5 pass
ntile_x 5 pass
cumsum 5 pass
cumsum_int 5 pass
cummean 5 pass
cummax 5 pass
cumall 5 pass
cumany 5 pass
consecutive_id 5 pass
grp_mean 5 pass
grp_lag 5 pass
grp_row_number 5 pass
grp_cumsum 5 pass
'sm_n', Phibble\Expr\Call 2 pass
'sm_sum', Phibble\Expr\Call 2 pass
'sm_sum_rm', Phibble\Expr\Call 2 pass
'sm_mean', Phibble\Expr\Call 2 pass
'sm_median', Phibble\Expr\Call 2 pass
'sm_sd', Phibble\Expr\Call 2 pass
'sm_var', Phibble\Expr\Call 2 pass
'sm_min', Phibble\Expr\Call 2 pass
'sm_max_s', Phibble\Expr\Call 2 pass
'sm_quantile', Phibble\Expr\Call 2 pass
'sm_iqr', Phibble\Expr\Call 2 pass
'sm_n_distinct', Phibble\Expr\Call 2 pass
'sm_n_distinct_rm', Phibble\Expr\Call 2 pass
'sm_first', Phibble\Expr\Call 2 pass
'sm_last_order', Phibble\Expr\Call 2 pass
'sm_nth', Phibble\Expr\Call 2 pass
'sm_any', Phibble\Expr\Call 2 pass
'sm_all', Phibble\Expr\Call 2 pass
sm_n 3 pass
sm_sum 3 pass
sm_sum_rm 3 pass
sm_mean 3 pass
sm_median 3 pass
sm_sd 3 pass
sm_var 3 pass
sm_min 3 pass
sm_max_s 3 pass
sm_quantile 3 pass
sm_iqr 3 pass
sm_n_distinct 3 pass
sm_n_distinct_rm 3 pass
sm_first 3 pass
sm_last_order 3 pass
sm_nth 3 pass
sm_any 3 pass
sm_all 3 pass
All 337 comparisons
Every comparison
Case Implementation Quantity Criterion Values Status
arith DataFrame mutate exact equality 7 pass
div DataFrame mutate exact equality 7 pass
mod DataFrame mutate exact equality 7 pass
pow DataFrame mutate exact equality 7 pass
cmp DataFrame mutate exact equality 7 pass
and DataFrame mutate exact equality 7 pass
or DataFrame mutate exact equality 7 pass
not DataFrame mutate exact equality 7 pass
is_na DataFrame mutate exact equality 7 pass
if_else DataFrame mutate exact equality 7 pass
case_when DataFrame mutate exact equality 7 pass
coalesce DataFrame mutate exact equality 7 pass
in_ DataFrame mutate exact equality 7 pass
between DataFrame mutate exact equality 7 pass
na_if DataFrame mutate exact equality 7 pass
round DataFrame mutate exact equality 7 pass
log DataFrame mutate exact equality 7 pass
str_lower DataFrame mutate exact equality 7 pass
str_length DataFrame mutate exact equality 7 pass
str_trim DataFrame mutate exact equality 7 pass
str_sub DataFrame mutate exact equality 7 pass
str_sub_neg DataFrame mutate exact equality 7 pass
str_detect DataFrame mutate exact equality 7 pass
str_replace DataFrame mutate exact equality 7 pass
str_replace_all DataFrame mutate exact equality 7 pass
paste0 DataFrame mutate exact equality 7 pass
paste DataFrame mutate exact equality 7 pass
as_string DataFrame mutate exact equality 7 pass
lag DataFrame mutate exact equality 7 pass
lead2 DataFrame mutate exact equality 7 pass
lag_order DataFrame mutate exact equality 7 pass
row_number DataFrame mutate exact equality 7 pass
row_number_desc DataFrame mutate exact equality 7 pass
min_rank DataFrame mutate exact equality 7 pass
dense_rank DataFrame mutate exact equality 7 pass
percent_rank DataFrame mutate exact equality 7 pass
cume_dist DataFrame mutate exact equality 7 pass
ntile DataFrame mutate exact equality 7 pass
ntile_x DataFrame mutate exact equality 7 pass
cumsum DataFrame mutate exact equality 7 pass
cumsum_int DataFrame mutate exact equality 7 pass
cummean DataFrame mutate exact equality 7 pass
cummax DataFrame mutate exact equality 7 pass
cumall DataFrame mutate exact equality 7 pass
cumany DataFrame mutate exact equality 7 pass
consecutive_id DataFrame mutate exact equality 7 pass
grp_mean DataFrame grouped mutate exact equality 7 pass
grp_lag DataFrame grouped mutate exact equality 7 pass
grp_row_number DataFrame grouped mutate exact equality 7 pass
grp_cumsum DataFrame grouped mutate exact equality 7 pass
'sm_n', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_sum', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_sum_rm', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_mean', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_median', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_sd', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_var', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_min', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_max_s', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_quantile', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_iqr', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_n_distinct', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_n_distinct_rm', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_first', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_last_order', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_nth', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_any', Phibble\Expr\Call DataFrame summarise exact equality pass
'sm_all', Phibble\Expr\Call DataFrame summarise exact equality pass
arith Polars mutate exact equality 7 pass
div Polars mutate exact equality 7 pass
mod Polars mutate exact equality 7 pass
pow Polars mutate exact equality 7 pass
cmp Polars mutate exact equality 7 pass
and Polars mutate exact equality 7 pass
or Polars mutate exact equality 7 pass
not Polars mutate exact equality 7 pass
is_na Polars mutate exact equality 7 pass
if_else Polars mutate exact equality 7 pass
case_when Polars mutate exact equality 7 pass
coalesce Polars mutate exact equality 7 pass
in_ Polars mutate exact equality 7 pass
between Polars mutate exact equality 7 pass
na_if Polars mutate exact equality 7 pass
round Polars mutate exact equality 7 pass
log Polars mutate exact equality 7 pass
str_lower Polars mutate exact equality 7 pass
str_length Polars mutate exact equality 7 pass
str_trim Polars mutate exact equality 7 pass
str_sub Polars mutate exact equality 7 pass
str_sub_neg Polars mutate exact equality 7 pass
str_detect Polars mutate exact equality 7 pass
str_replace Polars mutate exact equality 7 pass
str_replace_all Polars mutate exact equality 7 pass
paste0 Polars mutate exact equality 7 pass
paste Polars mutate exact equality 7 pass
as_string Polars mutate exact equality 7 pass
lag Polars mutate exact equality 7 pass
lead2 Polars mutate exact equality 7 pass
lag_order Polars mutate exact equality 7 pass
row_number Polars mutate exact equality 7 pass
row_number_desc Polars mutate exact equality 7 pass
min_rank Polars mutate exact equality 7 pass
dense_rank Polars mutate exact equality 7 pass
percent_rank Polars mutate exact equality 7 pass
cume_dist Polars mutate exact equality 7 pass
ntile Polars mutate exact equality 7 pass
ntile_x Polars mutate exact equality 7 pass
cumsum Polars mutate exact equality 7 pass
cumsum_int Polars mutate exact equality 7 pass
cummean Polars mutate exact equality 7 pass
cummax Polars mutate exact equality 7 pass
cumall Polars mutate exact equality 7 pass
cumany Polars mutate exact equality 7 pass
consecutive_id Polars mutate exact equality 7 pass
grp_mean Polars grouped mutate exact equality 7 pass
grp_lag Polars grouped mutate exact equality 7 pass
grp_row_number Polars grouped mutate exact equality 7 pass
grp_cumsum Polars grouped mutate exact equality 7 pass
'sm_n', Phibble\Expr\Call Polars summarise exact equality pass
'sm_sum', Phibble\Expr\Call Polars summarise exact equality pass
'sm_sum_rm', Phibble\Expr\Call Polars summarise exact equality pass
'sm_mean', Phibble\Expr\Call Polars summarise exact equality pass
'sm_median', Phibble\Expr\Call Polars summarise exact equality pass
'sm_sd', Phibble\Expr\Call Polars summarise exact equality pass
'sm_var', Phibble\Expr\Call Polars summarise exact equality pass
'sm_min', Phibble\Expr\Call Polars summarise exact equality pass
'sm_max_s', Phibble\Expr\Call Polars summarise exact equality pass
'sm_quantile', Phibble\Expr\Call Polars summarise exact equality pass
'sm_iqr', Phibble\Expr\Call Polars summarise exact equality pass
'sm_n_distinct', Phibble\Expr\Call Polars summarise exact equality pass
'sm_n_distinct_rm', Phibble\Expr\Call Polars summarise exact equality pass
'sm_first', Phibble\Expr\Call Polars summarise exact equality pass
'sm_last_order', Phibble\Expr\Call Polars summarise exact equality pass
'sm_nth', Phibble\Expr\Call Polars summarise exact equality pass
'sm_any', Phibble\Expr\Call Polars summarise exact equality pass
'sm_all', Phibble\Expr\Call Polars summarise exact equality pass
arith SQLite mutate exact equality 7 pass
div SQLite mutate exact equality 7 pass
mod SQLite mutate exact equality 7 pass
pow SQLite mutate exact equality 7 pass
cmp SQLite mutate exact equality 7 pass
and SQLite mutate exact equality 7 pass
or SQLite mutate exact equality 7 pass
not SQLite mutate exact equality 7 pass
is_na SQLite mutate exact equality 7 pass
if_else SQLite mutate exact equality 7 pass
case_when SQLite mutate exact equality 7 pass
coalesce SQLite mutate exact equality 7 pass
in_ SQLite mutate exact equality 7 pass
between SQLite mutate exact equality 7 pass
na_if SQLite mutate exact equality 7 pass
log SQLite mutate exact equality 7 pass
str_lower SQLite mutate exact equality 7 pass
str_length SQLite mutate exact equality 7 pass
str_trim SQLite mutate exact equality 7 pass
str_sub SQLite mutate exact equality 7 pass
str_sub_neg SQLite mutate exact equality 7 pass
str_detect SQLite mutate exact equality 7 pass
str_replace SQLite mutate exact equality 7 pass
str_replace_all SQLite mutate exact equality 7 pass
paste0 SQLite mutate exact equality 7 pass
paste SQLite mutate exact equality 7 pass
as_string SQLite mutate exact equality 7 pass
lag SQLite mutate exact equality 7 pass
lead2 SQLite mutate exact equality 7 pass
lag_order SQLite mutate exact equality 7 pass
row_number SQLite mutate exact equality 7 pass
row_number_desc SQLite mutate exact equality 7 pass
min_rank SQLite mutate exact equality 7 pass
dense_rank SQLite mutate exact equality 7 pass
percent_rank SQLite mutate exact equality 7 pass
cume_dist SQLite mutate exact equality 7 pass
ntile SQLite mutate exact equality 7 pass
ntile_x SQLite mutate exact equality 7 pass
cumsum SQLite mutate exact equality 7 pass
cumsum_int SQLite mutate exact equality 7 pass
cummean SQLite mutate exact equality 7 pass
cummax SQLite mutate exact equality 7 pass
cumall SQLite mutate exact equality 7 pass
cumany SQLite mutate exact equality 7 pass
consecutive_id SQLite mutate exact equality 7 pass
arith PostgreSQL mutate exact equality 7 pass
div PostgreSQL mutate exact equality 7 pass
mod PostgreSQL mutate exact equality 7 pass
pow PostgreSQL mutate exact equality 7 pass
cmp PostgreSQL mutate exact equality 7 pass
and PostgreSQL mutate exact equality 7 pass
or PostgreSQL mutate exact equality 7 pass
not PostgreSQL mutate exact equality 7 pass
is_na PostgreSQL mutate exact equality 7 pass
if_else PostgreSQL mutate exact equality 7 pass
case_when PostgreSQL mutate exact equality 7 pass
coalesce PostgreSQL mutate exact equality 7 pass
in_ PostgreSQL mutate exact equality 7 pass
between PostgreSQL mutate exact equality 7 pass
na_if PostgreSQL mutate exact equality 7 pass
log PostgreSQL mutate exact equality 7 pass
str_lower PostgreSQL mutate exact equality 7 pass
str_length PostgreSQL mutate exact equality 7 pass
str_trim PostgreSQL mutate exact equality 7 pass
str_sub PostgreSQL mutate exact equality 7 pass
str_sub_neg PostgreSQL mutate exact equality 7 pass
str_detect PostgreSQL mutate exact equality 7 pass
str_replace PostgreSQL mutate exact equality 7 pass
str_replace_all PostgreSQL mutate exact equality 7 pass
paste0 PostgreSQL mutate exact equality 7 pass
paste PostgreSQL mutate exact equality 7 pass
as_string PostgreSQL mutate exact equality 7 pass
lag PostgreSQL mutate exact equality 7 pass
lead2 PostgreSQL mutate exact equality 7 pass
lag_order PostgreSQL mutate exact equality 7 pass
row_number PostgreSQL mutate exact equality 7 pass
row_number_desc PostgreSQL mutate exact equality 7 pass
min_rank PostgreSQL mutate exact equality 7 pass
dense_rank PostgreSQL mutate exact equality 7 pass
percent_rank PostgreSQL mutate exact equality 7 pass
cume_dist PostgreSQL mutate exact equality 7 pass
ntile PostgreSQL mutate exact equality 7 pass
ntile_x PostgreSQL mutate exact equality 7 pass
cumsum PostgreSQL mutate exact equality 7 pass
cumsum_int PostgreSQL mutate exact equality 7 pass
cummean PostgreSQL mutate exact equality 7 pass
cummax PostgreSQL mutate exact equality 7 pass
cumall PostgreSQL mutate exact equality 7 pass
cumany PostgreSQL mutate exact equality 7 pass
consecutive_id PostgreSQL mutate exact equality 7 pass
arith MySQL mutate exact equality 7 pass
div MySQL mutate exact equality 7 pass
mod MySQL mutate exact equality 7 pass
pow MySQL mutate exact equality 7 pass
cmp MySQL mutate exact equality 7 pass
and MySQL mutate exact equality 7 pass
or MySQL mutate exact equality 7 pass
not MySQL mutate exact equality 7 pass
is_na MySQL mutate exact equality 7 pass
if_else MySQL mutate exact equality 7 pass
case_when MySQL mutate exact equality 7 pass
coalesce MySQL mutate exact equality 7 pass
in_ MySQL mutate exact equality 7 pass
between MySQL mutate exact equality 7 pass
na_if MySQL mutate exact equality 7 pass
log MySQL mutate exact equality 7 pass
str_lower MySQL mutate exact equality 7 pass
str_length MySQL mutate exact equality 7 pass
str_trim MySQL mutate exact equality 7 pass
str_sub MySQL mutate exact equality 7 pass
str_sub_neg MySQL mutate exact equality 7 pass
str_detect MySQL mutate exact equality 7 pass
str_replace MySQL mutate exact equality 7 pass
str_replace_all MySQL mutate exact equality 7 pass
paste0 MySQL mutate exact equality 7 pass
paste MySQL mutate exact equality 7 pass
as_string MySQL mutate exact equality 7 pass
lag MySQL mutate exact equality 7 pass
lead2 MySQL mutate exact equality 7 pass
lag_order MySQL mutate exact equality 7 pass
row_number MySQL mutate exact equality 7 pass
row_number_desc MySQL mutate exact equality 7 pass
min_rank MySQL mutate exact equality 7 pass
dense_rank MySQL mutate exact equality 7 pass
percent_rank MySQL mutate exact equality 7 pass
cume_dist MySQL mutate exact equality 7 pass
ntile MySQL mutate exact equality 7 pass
ntile_x MySQL mutate exact equality 7 pass
cumsum MySQL mutate exact equality 7 pass
cumsum_int MySQL mutate exact equality 7 pass
cummean MySQL mutate exact equality 7 pass
cummax MySQL mutate exact equality 7 pass
cumall MySQL mutate exact equality 7 pass
cumany MySQL mutate exact equality 7 pass
consecutive_id MySQL mutate exact equality 7 pass
grp_mean SQLite grouped mutate exact equality 7 pass
grp_lag SQLite grouped mutate exact equality 7 pass
grp_row_number SQLite grouped mutate exact equality 7 pass
grp_cumsum SQLite grouped mutate exact equality 7 pass
grp_mean PostgreSQL grouped mutate exact equality 7 pass
grp_lag PostgreSQL grouped mutate exact equality 7 pass
grp_row_number PostgreSQL grouped mutate exact equality 7 pass
grp_cumsum PostgreSQL grouped mutate exact equality 7 pass
grp_mean MySQL grouped mutate exact equality 7 pass
grp_lag MySQL grouped mutate exact equality 7 pass
grp_row_number MySQL grouped mutate exact equality 7 pass
grp_cumsum MySQL grouped mutate exact equality 7 pass
sm_n SQLite summarise exact equality 3 pass
sm_sum SQLite summarise exact equality 3 pass
sm_sum_rm SQLite summarise exact equality 3 pass
sm_mean SQLite summarise exact equality 3 pass
sm_median SQLite summarise exact equality 3 pass
sm_sd SQLite summarise exact equality 3 pass
sm_var SQLite summarise exact equality 3 pass
sm_min SQLite summarise exact equality 3 pass
sm_max_s SQLite summarise exact equality 3 pass
sm_quantile SQLite summarise exact equality 3 pass
sm_iqr SQLite summarise exact equality 3 pass
sm_n_distinct SQLite summarise exact equality 3 pass
sm_n_distinct_rm SQLite summarise exact equality 3 pass
sm_first SQLite summarise exact equality 3 pass
sm_last_order SQLite summarise exact equality 3 pass
sm_nth SQLite summarise exact equality 3 pass
sm_any SQLite summarise exact equality 3 pass
sm_all SQLite summarise exact equality 3 pass
sm_n PostgreSQL summarise exact equality 3 pass
sm_sum PostgreSQL summarise exact equality 3 pass
sm_sum_rm PostgreSQL summarise exact equality 3 pass
sm_mean PostgreSQL summarise exact equality 3 pass
sm_median PostgreSQL summarise exact equality 3 pass
sm_sd PostgreSQL summarise exact equality 3 pass
sm_var PostgreSQL summarise exact equality 3 pass
sm_min PostgreSQL summarise exact equality 3 pass
sm_max_s PostgreSQL summarise exact equality 3 pass
sm_quantile PostgreSQL summarise exact equality 3 pass
sm_iqr PostgreSQL summarise exact equality 3 pass
sm_n_distinct PostgreSQL summarise exact equality 3 pass
sm_n_distinct_rm PostgreSQL summarise exact equality 3 pass
sm_first PostgreSQL summarise exact equality 3 pass
sm_last_order PostgreSQL summarise exact equality 3 pass
sm_nth PostgreSQL summarise exact equality 3 pass
sm_any PostgreSQL summarise exact equality 3 pass
sm_all PostgreSQL summarise exact equality 3 pass
sm_n MySQL summarise exact equality 3 pass
sm_sum MySQL summarise exact equality 3 pass
sm_sum_rm MySQL summarise exact equality 3 pass
sm_mean MySQL summarise exact equality 3 pass
sm_median MySQL summarise exact equality 3 pass
sm_sd MySQL summarise exact equality 3 pass
sm_var MySQL summarise exact equality 3 pass
sm_min MySQL summarise exact equality 3 pass
sm_max_s MySQL summarise exact equality 3 pass
sm_quantile MySQL summarise exact equality 3 pass
sm_iqr MySQL summarise exact equality 3 pass
sm_n_distinct MySQL summarise exact equality 3 pass
sm_n_distinct_rm MySQL summarise exact equality 3 pass
sm_first MySQL summarise exact equality 3 pass
sm_last_order MySQL summarise exact equality 3 pass
sm_nth MySQL summarise exact equality 3 pass
sm_any MySQL summarise exact equality 3 pass
sm_all MySQL summarise exact equality 3 pass

Limitations

Exclusions

  • round: not run on SQL databases. SQL ROUND does not round half to even; SqlTable evaluates round() in memory.

Reproduction

From the repository root
Rscript tests/r/expr.R
PHIBBLE_TEST_PGSQL="pgsql:host=127.0.0.1;port=5432;dbname=postgres" PHIBBLE_TEST_PGSQL_USER=postgres PHIBBLE_TEST_MYSQL="mysql:host=127.0.0.1;port=3306" PHIBBLE_TEST_MYSQL_USER=root php vendor/bin/pest tests/ExprTest.php tests/SqlTest.php
php -d extension=php_polars.so php vendor/bin/pest tests/Polars/PolarsExprTest.php
Raw record
site/verifications/expressions-dplyr.json
Input data
tests/fixtures/expr/expected.json