{
  "_id": "6acb63c5fe5cc25786e8f311",
  "Package": "ksCompare",
  "Title": "Smart Data Frame Comparison in the Spirit of SAS PROC COMPARE",
  "Version": "0.2.4",
  "Authors@R": "person(\"Igor\", \"Aleschenkov\", , \"igor.aleschenkov@gmail.com\", role = c(\"aut\", \"cre\"))",
  "Description": "A tidyverse-native engine for comparing two data frames in\nthe spirit of SAS 'PROC COMPARE', with extensions for\nclinical/pharma workflows: per-column tolerances (absolute,\nrelative, and ULP), smart column matching, intelligent type\nreconciliation, SAS special-missing awareness, diff-pattern\ndetection, and rich HTML/Excel reports.",
  "License": "MIT + file LICENSE",
  "Encoding": "UTF-8",
  "Roxygen": "list(markdown = TRUE)",
  "RoxygenNote": "8.0.0",
  "Config/testthat/edition": "3",
  "URL": "https://al-garik.github.io/ksCompare/,\nhttps://github.com/al-garik/ksCompare,\nhttps://crow16384.r-universe.dev/ksCompare",
  "BugReports": "https://github.com/al-garik/ksCompare/issues",
  "VignetteBuilder": "knitr",
  "Config/pak/sysreqs": "libicu-dev",
  "Repository": "https://crow16384.r-universe.dev",
  "Date/Publication": "2026-08-12 19:09:39 UTC",
  "RemoteUrl": "https://github.com/al-garik/ksCompare",
  "RemoteRef": "HEAD",
  "RemoteSha": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-10-11 10:07:03 UTC",
    "User": "root"
  },
  "Author": "Igor Aleschenkov [aut, cre]",
  "Maintainer": "Igor Aleschenkov <igor.aleschenkov@gmail.com>",
  "_user": "crow16384",
  "_type": "src",
  "_file": "ksCompare_0.2.4.tar.gz",
  "_fileid": "https://r2.ropensci.org/ec229eae55cef1651f911671c584452a2c083065f31f8d7c220e086ef2831e33",
  "_filesize": 25467012,
  "_sha256": "ec229eae55cef1651f911671c584452a2c083065f31f8d7c220e086ef2831e33",
  "_expires": "2027-01-19T10:24:03.000Z",
  "_created": "2026-10-11T10:07:03.000Z",
  "_published": "2026-10-11T10:24:05.812Z",
  "_buildurl": "https://github.com/r-universe/crow16384/actions/runs/38130621123",
  "_status": "success",
  "_host": "GitHub-Actions",
  "_jobs": [
    {
      "job": 114444603662,
      "time": 147,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "NOTE",
      "artifact": "11698972792"
    },
    {
      "job": 114444603730,
      "time": 162,
      "config": "linux-release-x86_64",
      "r": "4.6.1",
      "check": "NOTE",
      "artifact": "11698714935"
    },
    {
      "job": 114444603703,
      "time": 140,
      "config": "macos-oldrel-arm64",
      "r": "4.5.3",
      "check": "NOTE",
      "artifact": "11699885018"
    },
    {
      "job": 114444603699,
      "time": 122,
      "config": "macos-release-arm64",
      "r": "4.6.1",
      "check": "NOTE",
      "artifact": "11699311636"
    },
    {
      "job": 114444055998,
      "time": 181,
      "config": "source",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "11698474790"
    },
    {
      "job": 114444603670,
      "time": 122,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "11698608233"
    },
    {
      "job": 114444603701,
      "time": 124,
      "config": "windows-devel-x86_64",
      "r": "4.7.0",
      "check": "NOTE",
      "artifact": "11698333314"
    },
    {
      "job": 114444603755,
      "time": 117,
      "config": "windows-oldrel-x86_64",
      "r": "4.5.3",
      "check": "NOTE",
      "artifact": "11699019328"
    },
    {
      "job": 114444603735,
      "time": 107,
      "config": "windows-release-x86_64",
      "r": "4.6.1",
      "check": "NOTE",
      "artifact": "11698924384"
    }
  ],
  "_upstream": "https://github.com/al-garik/ksCompare",
  "_commit": {
    "id": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
    "author": "Vladimir Larchenko <vladimir.larchenko@keystatsolutions.com>",
    "committer": "Vladimir Larchenko <vladimir.larchenko@keystatsolutions.com>",
    "message": "perf: speed up ks_save2xlsx_by by ~20x for large data\n\nwb_add_border with inner_hgrid/inner_vgrid was O(rows²) — it emitted\nan individual XML style entry per cell. At 20k rows × 8 sheets this\ncost ~22s, dominating total runtime.\n\nChanges:\n- Replace wb_add_data + wb_add_filter + wb_add_border with\n  wb_add_data_table (TableStyleMedium2), which writes borders and\n  autofilter as a single O(1) table definition regardless of row count\n- Replace widths = 'auto' with a sampled width estimator (up to 200\n  rows) capped at 60 chars, avoiding a full O(rows × cols) scan\n- Pre-split data before the loop with split() instead of per-iteration\n  dplyr::filter + select, eliminating redundant data-frame copies\n\nBenchmark: 20k rows, 8 sheets, 3 colors → 1.1s vs ~22s original.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n",
    "time": 1786561779
  },
  "_maintainer": {
    "name": "Igor Aleschenkov",
    "email": "igor.aleschenkov@gmail.com",
    "login": "algarik",
    "description": "",
    "uuid": 179924434
  },
  "_distro": "resolute",
  "_registered": true,
  "_dependencies": [
    {
      "package": "R",
      "version": ">= 4.1",
      "role": "Depends"
    },
    {
      "package": "base64enc",
      "role": "Imports"
    },
    {
      "package": "cli",
      "role": "Imports"
    },
    {
      "package": "digest",
      "role": "Imports"
    },
    {
      "package": "dplyr",
      "role": "Imports"
    },
    {
      "package": "purrr",
      "role": "Imports"
    },
    {
      "package": "rlang",
      "role": "Imports"
    },
    {
      "package": "stringi",
      "role": "Imports"
    },
    {
      "package": "tibble",
      "role": "Imports"
    },
    {
      "package": "vctrs",
      "role": "Imports"
    },
    {
      "package": "arrow",
      "role": "Suggests"
    },
    {
      "package": "arsenal",
      "role": "Suggests"
    },
    {
      "package": "broom",
      "role": "Suggests"
    },
    {
      "package": "clue",
      "role": "Suggests"
    },
    {
      "package": "ggplot2",
      "role": "Suggests"
    },
    {
      "package": "haven",
      "role": "Suggests"
    },
    {
      "package": "htmltools",
      "role": "Suggests"
    },
    {
      "package": "knitr",
      "role": "Suggests"
    },
    {
      "package": "openxlsx2",
      "role": "Suggests"
    },
    {
      "package": "pointblank",
      "role": "Suggests"
    },
    {
      "package": "reactable",
      "role": "Suggests"
    },
    {
      "package": "rmarkdown",
      "role": "Suggests"
    },
    {
      "package": "stringdist",
      "role": "Suggests"
    },
    {
      "package": "testthat",
      "version": ">= 3.0.0",
      "role": "Suggests"
    },
    {
      "package": "withr",
      "role": "Suggests"
    }
  ],
  "_owner": "al-garik",
  "_selfowned": true,
  "_usedby": 0,
  "_updates": [
    {
      "week": "2026-18",
      "n": 3
    },
    {
      "week": "2026-20",
      "n": 2
    },
    {
      "week": "2026-23",
      "n": 4
    },
    {
      "week": "2026-28",
      "n": 2
    },
    {
      "week": "2026-29",
      "n": 1
    },
    {
      "week": "2026-33",
      "n": 1
    }
  ],
  "_tags": [],
  "_topics": [
    "clinical-trials",
    "datasets-comparison"
  ],
  "_stars": 1,
  "_contributors": [
    {
      "user": "al-garik",
      "count": 7,
      "uuid": 248288395
    },
    {
      "user": "xakomowe",
      "count": 2,
      "uuid": 248909102
    }
  ],
  "_userbio": {
    "uuid": 115039243,
    "type": "user",
    "name": "crow16384",
    "followers": 0
  },
  "_downloads": {
    "count": 0,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/ksCompare"
  },
  "_devurl": "https://github.com/al-garik/kscompare",
  "_pkgdown": "https://al-garik.github.io/ksCompare/",
  "_searchresults": 22,
  "_rbuild": "4.6.1",
  "_assets": [
    "extra/citation.cff",
    "extra/citation.html",
    "extra/citation.json",
    "extra/citation.txt",
    "extra/contents.json",
    "extra/ksCompare.html",
    "extra/manual.pdf",
    "extra/NEWS.html",
    "extra/NEWS.txt",
    "extra/readme.html",
    "extra/readme.md",
    "LICENSE"
  ],
  "_cranurl": false,
  "_exports": [
    "as_ks_comparison",
    "as_outbase",
    "as_outcomp",
    "as_outdif",
    "as_outnoequal",
    "as_tibble",
    "ks_assert_clean",
    "ks_cause_summary",
    "ks_check_report_html",
    "ks_check_rules",
    "ks_check_summary",
    "ks_collapse_check_msgs",
    "ks_comp_options",
    "ks_compare",
    "ks_compare_check_state",
    "ks_glance",
    "ks_match_health",
    "ks_pointblank_step",
    "ks_recommendations",
    "ks_report_html",
    "ks_report_xlsx",
    "ks_row_diff_summary",
    "ks_save2xlsx_by",
    "ks_set_comp_options",
    "ks_suggest_key",
    "ks_sysinfo",
    "ks_tidy",
    "ks_tol",
    "ks_unmatched_rows"
  ],
  "_help": [
    {
      "page": "as_ks_comparison",
      "title": "Convert an 'arsenal::comparedf' result into a 'ks_comparison'",
      "topics": [
        "as_ks_comparison"
      ]
    },
    {
      "page": "ks_assert_clean",
      "title": "Use a comparison as a pipeline gate",
      "topics": [
        "ks_assert_clean",
        "ks_pointblank_step"
      ]
    },
    {
      "page": "ks_cause_summary",
      "title": "Diff causes summary",
      "topics": [
        "ks_cause_summary"
      ]
    },
    {
      "page": "ks_check_report_html",
      "title": "Render an HTML check report",
      "topics": [
        "ks_check_report_html"
      ]
    },
    {
      "page": "ks_check_rules",
      "title": "Apply a list of validation rules to a data frame",
      "topics": [
        "ks_check_rules"
      ]
    },
    {
      "page": "ks_check_summary",
      "title": "Summarise check results from 'ks_check_rules()'",
      "topics": [
        "ks_check_summary"
      ]
    },
    {
      "page": "ks_collapse_check_msgs",
      "title": "Collapse list-column of check messages to a character column",
      "topics": [
        "ks_collapse_check_msgs"
      ]
    },
    {
      "page": "ks_comp_options",
      "title": "Comparison options",
      "topics": [
        "ks_comp_options"
      ]
    },
    {
      "page": "ks_compare",
      "title": "Compare two data frames",
      "topics": [
        "ks_compare"
      ]
    },
    {
      "page": "ks_compare_check_state",
      "title": "Compare validation check state between two runs",
      "topics": [
        "ks_compare_check_state"
      ]
    },
    {
      "page": "ks_glance",
      "title": "Glance at a ks_comparison",
      "topics": [
        "ks_glance"
      ]
    },
    {
      "page": "ks_match_health",
      "title": "Match-quality health check",
      "topics": [
        "ks_match_health"
      ]
    },
    {
      "page": "ks_recommendations",
      "title": "Actionable recommendations for a comparison",
      "topics": [
        "ks_recommendations"
      ]
    },
    {
      "page": "ks_report_html",
      "title": "Render a self-contained HTML report",
      "topics": [
        "ks_report_html"
      ]
    },
    {
      "page": "ks_report_xlsx",
      "title": "Render an Excel workbook report",
      "topics": [
        "ks_report_xlsx"
      ]
    },
    {
      "page": "ks_row_diff_summary",
      "title": "Per-row diff summary",
      "topics": [
        "ks_row_diff_summary"
      ]
    },
    {
      "page": "ks_save2xlsx_by",
      "title": "Save a data frame to an XLSX workbook split by a grouping column",
      "topics": [
        "ks_save2xlsx_by"
      ]
    },
    {
      "page": "ks_set_comp_options",
      "title": "Set ksCompare global options",
      "topics": [
        "ks_set_comp_options"
      ]
    },
    {
      "page": "ks_suggest_key",
      "title": "Suggest additional key columns when duplicates exist",
      "topics": [
        "ks_suggest_key"
      ]
    },
    {
      "page": "ks_sysinfo",
      "title": "SAS SYSINFO-compatible bitmask for a comparison",
      "topics": [
        "ks_sysinfo"
      ]
    },
    {
      "page": "ks_tidy",
      "title": "Tidy a ks_comparison",
      "topics": [
        "ks_tidy",
        "ks_tidy.ks_comparison"
      ]
    },
    {
      "page": "ks_tol",
      "title": "Tolerance specification for numeric comparisons",
      "topics": [
        "ks_tol"
      ]
    },
    {
      "page": "ks_unmatched_rows",
      "title": "Unmatched rows from a comparison",
      "topics": [
        "ks_unmatched_rows"
      ]
    },
    {
      "page": "sas-out",
      "title": "SAS PROC COMPARE-style output datasets",
      "topics": [
        "as_outbase",
        "as_outcomp",
        "as_outdif",
        "as_outnoequal",
        "sas-out"
      ]
    },
    {
      "page": "summary.ks_comparison",
      "title": "Summary statistics for a ks_comparison",
      "topics": [
        "summary.ks_comparison"
      ]
    }
  ],
  "_pkglogo": "https://github.com/al-garik/ksCompare/raw/HEAD/man/figures/logo.png",
  "_readme": "https://github.com/al-garik/ksCompare/raw/HEAD/README.md",
  "_rundeps": [
    "base64enc",
    "cli",
    "digest",
    "dplyr",
    "generics",
    "glue",
    "lifecycle",
    "magrittr",
    "pillar",
    "pkgconfig",
    "purrr",
    "R6",
    "rlang",
    "stringi",
    "tibble",
    "tidyselect",
    "utf8",
    "vctrs",
    "withr"
  ],
  "_vignettes": [
    {
      "source": "from-proc-compare.Rmd",
      "filename": "from-proc-compare.html",
      "title": "From PROC COMPARE",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Cheat sheet",
        "Row matching strategies",
        "OUT* outputs",
        "SYSINFO bitmask",
        "Things ksCompare does not try to replicate"
      ],
      "created": "2026-04-29 08:03:28",
      "modified": "2026-07-06 13:43:16",
      "commits": 3
    },
    {
      "source": "getting-started.Rmd",
      "filename": "getting-started.html",
      "title": "Getting started with ksCompare",
      "engine": "knitr::rmarkdown",
      "headings": [
        "A first comparison",
        "What's inside cmp?",
        "Triage helpers",
        "Tolerances",
        "Options",
        "Renamed columns",
        "Reading files directly",
        "Duplicate keys",
        "Next steps"
      ],
      "created": "2026-04-29 08:03:28",
      "modified": "2026-07-06 13:43:16",
      "commits": 3
    },
    {
      "source": "pipeline-gates.Rmd",
      "filename": "pipeline-gates.html",
      "title": "Pipeline gates",
      "engine": "knitr::rmarkdown",
      "headings": [
        "ks_assert_clean",
        "Tolerating known diffs",
        "CI integration",
        "With pointblank",
        "With arsenal"
      ],
      "created": "2026-04-29 08:03:28",
      "modified": "2026-04-29 11:22:40",
      "commits": 2
    },
    {
      "source": "powerful_data_validation_engine.Rmd",
      "filename": "powerful_data_validation_engine.html",
      "title": "Powerful Data Validation Engine",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Introduction",
        "Overview",
        "Key Features",
        "Core Concepts",
        "Rule Structure",
        "Data Structure",
        "Result Structure",
        "Usage Examples",
        "Complete Example",
        "Example data:",
        "Validation rules",
        "Mode Comparison",
        "When to Use Which?",
        "Performance Tips",
        "Error Message Design",
        "Advanced Usage",
        "Categorizing Violations",
        "Generating Summary Reports",
        "HTML Check Report",
        "XLSX Export",
        "Tracking Changes Across Runs",
        "Visualizing Validation Results",
        "Common Patterns and Recipes",
        "Range Checks",
        "Presence Checks",
        "Format Validation",
        "Conditional Checks",
        "Reference Data Checks",
        "Group-Specific Validation",
        "Best Practices",
        "Conclusion",
        "Key Benefits",
        "Final Thoughts"
      ],
      "created": "2026-07-13 14:34:22",
      "modified": "2026-07-13 14:34:22",
      "commits": 1
    },
    {
      "source": "reports.Rmd",
      "filename": "reports.html",
      "title": "Reports",
      "engine": "knitr::rmarkdown",
      "headings": [
        "HTML",
        "Smart sampling",
        "Group by key",
        "Excel"
      ],
      "created": "2026-04-29 08:03:28",
      "modified": "2026-07-06 13:43:16",
      "commits": 3
    },
    {
      "source": "smart-features.Rmd",
      "filename": "smart-features.html",
      "title": "Smart features",
      "engine": "knitr::rmarkdown",
      "headings": [
        "ULP tolerance",
        "Auto-key inference",
        "Diff triage helpers",
        "First / last unequal observations",
        "Duplicate-key strategies",
        "SAS format normalisation",
        "Encoding-safe string comparison",
        "Pattern detection"
      ],
      "created": "2026-04-29 08:03:28",
      "modified": "2026-07-06 13:43:16",
      "commits": 3
    }
  ],
  "_score": 4.597695185925512,
  "_indexed": true,
  "_nocasepkg": "kscompare",
  "_universes": [
    "crow16384",
    "algarik",
    "al-garik"
  ],
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.2.4",
      "date": "2026-10-11T10:09:16.000Z",
      "distro": "resolute",
      "commit": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
      "fileid": "https://r2.ropensci.org/ad7c0d27b3400702796a3ce19d59c20304140cfa84ac33b301d452dadd12c4ee",
      "status": "success",
      "check": "NOTE",
      "buildurl": "https://github.com/r-universe/crow16384/actions/runs/38130621123"
    },
    {
      "r": "4.6.1",
      "os": "linux",
      "version": "0.2.4",
      "date": "2026-10-11T10:09:32.000Z",
      "distro": "resolute",
      "commit": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
      "fileid": "https://r2.ropensci.org/b37421bbb731533675f6981191a40c74f383a1ee99168bd8416d438c5e877709",
      "status": "success",
      "check": "NOTE",
      "buildurl": "https://github.com/r-universe/crow16384/actions/runs/38130621123"
    },
    {
      "r": "4.5.3",
      "os": "mac",
      "version": "0.2.4",
      "date": "2026-10-11T10:23:09.000Z",
      "commit": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
      "fileid": "https://r2.ropensci.org/c3f261ad9ba5dbf0dc39c5c476cbc6f81ca6afb7e1ac5cef89b9f2f39546ddd4",
      "status": "success",
      "check": "NOTE",
      "buildurl": "https://github.com/r-universe/crow16384/actions/runs/38130621123"
    },
    {
      "r": "4.6.1",
      "os": "mac",
      "version": "0.2.4",
      "date": "2026-10-11T10:22:07.000Z",
      "commit": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
      "fileid": "https://r2.ropensci.org/15c0b452679e92778eb530a0dbd7998d6e24616dbc6c11fec0a8918d07606c2f",
      "status": "success",
      "check": "NOTE",
      "buildurl": "https://github.com/r-universe/crow16384/actions/runs/38130621123"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.2.4",
      "date": "2026-10-11T10:09:29.000Z",
      "commit": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
      "fileid": "https://r2.ropensci.org/934d10b97601d0720184ce36755f6aae4b116fb03838d7c5d01412c51696a804",
      "status": "success",
      "buildurl": "https://github.com/r-universe/crow16384/actions/runs/38130621123"
    },
    {
      "r": "4.7.0",
      "os": "win",
      "version": "0.2.4",
      "date": "2026-10-11T10:08:51.000Z",
      "commit": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
      "fileid": "https://r2.ropensci.org/6fd4e710f13c5bd71a0384438e389463a04aec95fcd09d0cba97062ffc3d8d92",
      "status": "success",
      "check": "NOTE",
      "buildurl": "https://github.com/r-universe/crow16384/actions/runs/38130621123"
    },
    {
      "r": "4.5.3",
      "os": "win",
      "version": "0.2.4",
      "date": "2026-10-11T10:08:46.000Z",
      "commit": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
      "fileid": "https://r2.ropensci.org/994194aa69b1871cc265c54338341ea4979eb2463d1dd1d7ba318c3ea8dc5575",
      "status": "success",
      "check": "NOTE",
      "buildurl": "https://github.com/r-universe/crow16384/actions/runs/38130621123"
    },
    {
      "r": "4.6.1",
      "os": "win",
      "version": "0.2.4",
      "date": "2026-10-11T10:08:25.000Z",
      "commit": "1ed505b1d140ba7b8ffef5b11d391f0d8c7746b6",
      "fileid": "https://r2.ropensci.org/2cda290396da6fa4ca6180aedf014e8b7898caf1a11703d7902aac6555671909",
      "status": "success",
      "check": "NOTE",
      "buildurl": "https://github.com/r-universe/crow16384/actions/runs/38130621123"
    }
  ]
}