Review ask

As a clinical trial statistician or programmer, challenge anything in this benchmark: describe a problem in Comments, or propose a fix with the Edit button on any source file.

  1. Task: Would a real study need this derivation, specified this way? Does it follow CDISC ADaM: variable names, controlled terms, record structure? Flag any rule that is ambiguous or that a sponsor would handle differently.
  2. Inputs: Do they look like data collected in a real trial, and do they include the situations you would expect to meet in one?
  3. Expected output: Would independent QC programming reproduce every value from these inputs and rules?

The other tabs beside Comments are background for assessment, not under review.

Summary

Lifecycle: reviewedEditUnder review
What this benchmark means
README.md

Goal: derive UPPERTXT, LOWERTXT, EQUALFL, LEASTTXT, GREATESTTXT, MAPCAT, TEXTSEQ, MINTXT, and MAXTXT for each subject from the collected text and a comparison text.

Input: demographics records carrying RAWTXT (collected text) and PEERTXT (comparison text).

Variables:

  • UPPERTXT is RAWTXT with American Standard Code for Information Interchange (ASCII) lowercase letters changed to uppercase; every other character is unchanged, and missing text gives the text MISSING.
  • LOWERTXT is RAWTXT with ASCII uppercase letters changed to lowercase; every other character is unchanged, and missing text gives the text MISSING.
  • EQUALFL is Y when RAWTXT and PEERTXT hold identical character sequences (same code points in the same order), including when both are missing; otherwise it is N.
  • LEASTTXT is the earlier non-missing value of RAWTXT and PEERTXT by Unicode code-point order (called scalar order below), left blank when both are missing.
  • GREATESTTXT is the later non-missing value of RAWTXT and PEERTXT by scalar order, left blank when both are missing.
  • MAPCAT groups spellings that differ only in the case of ASCII letters: any casing of abc gives ASCII and i or I gives ASCII_I. Missing text gives the text MISSING, and any other text gives OTHER, so text holding a character outside ASCII never joins a group.
  • TEXTSEQ numbers rows in scalar order of the collected text, breaking ties by subject, with missing text last.
  • MINTXT is the earliest collected text in the study by scalar order, shown on every row.
  • MAXTXT is the latest collected text in the study by scalar order, shown on every row.

Note: text is never normalized, so a composed and a decomposed spelling of the same word (an accented letter stored as one character, or as the base letter plus a combining accent) are different values. The flag, the earlier and later values, the sequence, and the minimum and maximum all follow scalar order.

Inputs

Under review
1 source file

input/dm.csv

Edit
8 rows
input/dm.csv
STUDYIDUSUBJIDRAWTXTPEERTXT
TEXTabcabc
TEXTAbCabc
TEXTcafécafé
TEXTcafécafé
TEXTstraßestraße
TEXTİIıiİIıi
TEXT😀ABCDE😀ABCDE
TEXT——

Expected output

Under review
8 expected rows

expected/adsl.csv

Edit
8 rows
expected/adsl.csv
STUDYIDUSUBJIDRAWTXTUPPERTXTLOWERTXTEQUALFLLEASTTXTGREATESTTXTMAPCATTEXTSEQMINTXTMAXTXT
TEXTAbCABCabcNAbCabcASCII1AbC😀ABCDE
TEXTabcABCabcYabcabcASCII2AbC😀ABCDE
TEXTcaféCAFÉcaféNcafécaféOTHER3AbC😀ABCDE
TEXTcaféCAFécaféNcafécaféOTHER4AbC😀ABCDE
TEXTstraßeSTRAßEstraßeYstraßestraßeOTHER5AbC😀ABCDE
TEXTİIıiİIıIİiıiYİIıiİIıiOTHER6AbC😀ABCDE
TEXT😀ABCDE😀ABCDE😀abcdeY😀ABCDE😀ABCDEOTHER7AbC😀ABCDE
TEXT—MISSINGMISSINGY——MISSING8AbC😀ABCDE
Shaded columns are derived— = missing value

Comments and assessment materials

Comments

Signed in with GitHub; saved in repository Discussions

Mapping spec

Generated from the benchmark YAML; do not edit by hand

Dataset NameVariable NameVariable LabelTypeCodelist/Controlled TermsCoreComputational MethodOrigin
ADSLSTUDYIDStudy IdentifiercharacterCopy value from DM.STUDYID.Predecessor
ADSLUSUBJIDUnique Subject IdentifiercharacterCopy value from DM.USUBJID.Predecessor
ADSLRAWTXTRaw TextcharacterCopy value from DM.RAWTXT.Predecessor
ADSLUPPERTXTUppercase ASCII TextcharacterConvert RAWTXT to upper case; a missing source → "MISSING".Derived
ADSLLOWERTXTLowercase ASCII TextcharacterConvert RAWTXT to lower case; a missing source → "MISSING".Derived
ADSLEQUALFLExact Text Equality FlagcharacterIf RAWTXT IS NULL AND PEERTXT IS NULL then "Y"; If RAWTXT = PEERTXT then "Y"; otherwise "N".Derived
ADSLLEASTTXTEarlier Text by Scalar OrdercharacterLeast of RAWTXT and PEERTXT.Derived
ADSLGREATESTTXTLater Text by Scalar OrdercharacterGreatest of RAWTXT and PEERTXT.Derived
ADSLMAPCATASCII Folded Mapping CategorycharacterIf RAWTXT IS NULL then "MISSING"; otherwise recode RAWTXT: "ABC" → "ASCII", "I" → "ASCII_I"; missing values are errors; unlisted values → "OTHER"; matching ignores letter case.Derived
ADSLTEXTSEQText Scalar Order SequencenumericRow number within each group of , ordered by RAWTXT then USUBJID.Derived
ADSLMINTXTMinimum Study TextcharacterAggregate MIN(DM.RAWTXT) over records grouped by DM.STUDYID, matching on STUDYID.Derived
ADSLMAXTXTMaximum Study TextcharacterAggregate MAX(DM.RAWTXT) over records grouped by DM.STUDYID, matching on STUDYID.Derived
VersionDateAuthorDescriptionReviewerSign-off
1.32026-09-29yamaa docs buildShow study codelist names, external dictionaries, and ISO 8601 formats in variable rows; list the document's codelist values and metadata
1.22026-09-29yamaa docs buildClassify ADaM copies from a declared input as Predecessor and recodes as Derived, and SDTM recodes of locally derived columns as Derived
1.12026-09-29yamaa docs buildResolve lookups into the donor record they select, and give every derivation shape a plain-language rule instead of its raw YAML
1.0yamaa docs buildInitial generation from spec.yaml

yamaa code

Runs the yamaa specification; its result must match the expected output

run.R

Edit
4 lines
library(yamaa)adsl <- yamaa_domain("spec.yaml")$outputadsl

run.py

Edit
4 lines
import yamaaadsl = yamaa.yamaa_domain("spec.yaml").outputadsl