NEWS
ksCompare 0.2.0
Performance
- Row matching for duplicate-key strategies
keep_all and all_pairs
(ks_match_rows_keep_all(), ks_match_rows_all_pairs()) now
pre-allocates the per-group parts list and caches the level factor
used for splitting, removing O(n^2) list-copy churn on data sets with
many unique keys.
- The main comparison loop in
ks_compare() now pre-allocates the
value_parts accumulator and uses order(..., method = "radix") for
the final stable sort of value_diff, materially speeding up wide
comparisons (many matched column pairs) and large diff tables.
ks_schema_diff() no longer rescans meta_b$name / meta_c$name for
every column pair; it builds a name-indexed lookup once and reuses
per-row metadata, and it hoists the compare_labels / compare_formats
option checks out of the per-column loop.
ks_value_diff_one() now slices the unequal cells once and reuses the
result for ks_explain_diffs(), format_cell(), and ks_na_flow(),
avoiding three redundant subsets on large columns; the type-mismatch
branch likewise slices base_col / comp_col only once.
Internal
- No user-facing API changes; all optimisations are behaviour-preserving.
ksCompare 0.1.0
- Initial development release. ksCompare is a tidyverse-native engine for
comparing two data frames in the spirit of SAS
PROC COMPARE, with
extensions for clinical/pharma workflows. Highlights:
ks_compare() orchestrator with explicit by keys, by = "auto"
uniqueness inference, and explicit column mapping.
ks_tol() with absolute, relative, and ULP tolerance plus per-column
overrides.
ks_comp_options() for NA semantics, SAS special-missing handling,
label/format comparison, string trim/case/normalize toggles, and an
optional path that pins every downstream ks_report_*() artefact
to a single output folder. Every field also falls back to a
getOption("ksCompare.<arg>") global, and ks_set_comp_options()
forwards to options() for project-wide defaults.
ks_comparison S3 with print(), summary(), as_tibble(),
ks_tidy(), ks_glance().
- Per-type cell diff for numeric (with ULP-aware compare), character,
factor, date/datetime, and
haven_labelled columns; encoding-safe
string comparison.
- Schema diff including label and SAS-format mismatches; format
comparison is trailing-dot- and case-tolerant so haven import
artefacts do not surface as false diffs.
- Manifest with input hashes and package version for QC traceability.
as_outbase(), as_outcomp(), as_outdif(), as_outnoequal()
helpers reshape diffs into PROC COMPARE-style tibbles, plus
ks_sysinfo() for a SAS-compatible bitmask.
- Smart features: auto-key inference, fuzzy column rename suggestions
(Suggests-gated on
stringdist), duplicate-key strategies (first,
last, keep_all, all_pairs, error), and pattern detection
(constant_offset, constant_scale, sign_flip, integer_round,
whitespace_only, trim_only, case_only, factor_recoded).
- Reports:
ks_report_html() (self-contained htmltools +
reactable page with sticky TOC, KPI cards, status pill, themed
tables, an optional group_by_key mode that renders one collapsed
block per key value, and a print-friendly stylesheet) and
ks_report_xlsx() (openxlsx2 multi-sheet workbook with conditional
formatting on OUT_DIF). The HTML report inlines every JS/CSS
dependency into a single file, so no sibling lib/ folder is
written next to the report.
- I/O:
ks_read_sas() / ks_read_xpt() (haven wrappers preserving
labelled metadata) and ks_read_arrow() (Parquet / Feather).
- Ecosystem:
ks_assert_clean() pipeline gate with
ks_pointblank_step() adapter; as_ks_comparison() generic with
method for arsenal::comparedf.
- Documentation: pkgdown site, five long-form vignettes
(
getting-started, from-proc-compare, smart-features,
reports, pipeline-gates), and CI workflows for R-CMD-check,
pkgdown, and test-coverage.