As a clinical trial statistician or programmer, answer three short questions in Your review: the task, the inputs and outputs, and the AI-assisted review. Agreeing with all three approves this benchmark; disagreeing with any needs a comment. Propose a fix with the Edit button on any source file, or add it to your comments.
We suggest spending no more than 5 minutes on a review. The other tabs beside Your review are background for assessment, not under review.
Summary
README.mdPublic entries: Python and R. Passing coverage requires an installed inventory.
Goal: derive the criteria CRIT1 to CRIT5 and their flags: whether an
on-treatment Fridericia-corrected QT interval (QTcF) lies above 450, 480 or
500 milliseconds (ms), and whether its increase from baseline lies above 30
or 60 ms.
Input: electrocardiogram (ECG) analysis records, one per subject,
parameter and analysis visit, with the value AVAL in ms, the baseline flag
ABLFL, the on-treatment flag ONTRTFL, and the baseline value BASE and
change from baseline CHG already in place.
Variables:
CRIT1,CRIT2,CRIT3:QTcF > 450 ms,QTcF > 480 msandQTcF > 500 ms; empty when the record is not assessed orAVALis missing.CRIT1FL,CRIT2FL,CRIT3FL:YwhenAVALis above the limit andNotherwise, so a value exactly at a limit readsN.CRIT4,CRIT5:QTcF increase from baseline > 30 msandQTcF increase from baseline > 60 ms; empty when the record is not assessed or has noCHG, as without a baseline value, while its absolute criteria are still assessed.CRIT4FL,CRIT5FL:YwhenCHGis above the limit andNotherwise: an increase of exactly 30 readsN, and a decrease never meets them, however large.
Note: only on-treatment QTcF records (ONTRTFL is Y) are assessed;
baseline records, records after the on-treatment window and other
parameters, such as the uncorrected QT interval, carry no criterion. Values
are compared unrounded, and each flag is empty exactly where its criterion
is. A baseline record marked on treatment, or a change without a baseline
value, stops the run.
Inputs
Under review1 source fileinput/adeg_raw.csv
Edit16 rows| STUDYID | USUBJID | PARAMCD | PARAM | AVISIT | AVAL | ABLFL | ONTRTFL | BASE | CHG |
|---|---|---|---|---|---|---|---|---|---|
| YAMAA-01 | QTCF | QTcF Interval (ms) | BASELINE | 420 | Y | — | 420 | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 2 | 450 | — | Y | 420 | 30 | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 4 | 450.4 | — | Y | 420 | 30.4 | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | FOLLOW-UP | 482 | — | — | 420 | 62 | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | BASELINE | 385 | Y | — | 385 | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 2 | 445 | — | Y | 385 | 60 | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 4 | 445.4 | — | Y | 385 | 60.4 | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 8 | — | — | Y | 385 | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | BASELINE | 490 | Y | — | 490 | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 2 | 480 | — | Y | 490 | -10 | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 4 | 480.4 | — | Y | 490 | -9.6 | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 8 | 455 | — | Y | 490 | -35 | |
| YAMAA-01 | QT | QT Interval (ms) | BASELINE | 430 | Y | — | 430 | — | |
| YAMAA-01 | QT | QT Interval (ms) | WEEK 2 | 470 | — | Y | 430 | 40 | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 2 | 500 | — | Y | — | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 4 | 500.4 | — | Y | — | — |
Expected output
Under review16 expected rowsexpected/adeg.csv
Edit16 rows| STUDYID | USUBJID | PARAMCD | PARAM | AVISIT | AVAL | ABLFL | ONTRTFL | BASE | CHG | CRIT1 | CRIT1FL | CRIT2 | CRIT2FL | CRIT3 | CRIT3FL | CRIT4 | CRIT4FL | CRIT5 | CRIT5FL |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| YAMAA-01 | QTCF | QTcF Interval (ms) | BASELINE | 420 | Y | — | 420 | — | — | — | — | — | — | — | — | — | — | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 2 | 450 | — | Y | 420 | 30 | QTcF > 450 ms | N | QTcF > 480 ms | N | QTcF > 500 ms | N | QTcF increase from baseline > 30 ms | N | QTcF increase from baseline > 60 ms | N | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 4 | 450.4 | — | Y | 420 | 30.4 | QTcF > 450 ms | Y | QTcF > 480 ms | N | QTcF > 500 ms | N | QTcF increase from baseline > 30 ms | Y | QTcF increase from baseline > 60 ms | N | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | FOLLOW-UP | 482 | — | — | 420 | 62 | — | — | — | — | — | — | — | — | — | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | BASELINE | 385 | Y | — | 385 | — | — | — | — | — | — | — | — | — | — | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 2 | 445 | — | Y | 385 | 60 | QTcF > 450 ms | N | QTcF > 480 ms | N | QTcF > 500 ms | N | QTcF increase from baseline > 30 ms | Y | QTcF increase from baseline > 60 ms | N | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 4 | 445.4 | — | Y | 385 | 60.4 | QTcF > 450 ms | N | QTcF > 480 ms | N | QTcF > 500 ms | N | QTcF increase from baseline > 30 ms | Y | QTcF increase from baseline > 60 ms | Y | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 8 | — | — | Y | 385 | — | — | — | — | — | — | — | — | — | — | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | BASELINE | 490 | Y | — | 490 | — | — | — | — | — | — | — | — | — | — | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 2 | 480 | — | Y | 490 | -10 | QTcF > 450 ms | Y | QTcF > 480 ms | N | QTcF > 500 ms | N | QTcF increase from baseline > 30 ms | N | QTcF increase from baseline > 60 ms | N | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 4 | 480.4 | — | Y | 490 | -9.6 | QTcF > 450 ms | Y | QTcF > 480 ms | Y | QTcF > 500 ms | N | QTcF increase from baseline > 30 ms | N | QTcF increase from baseline > 60 ms | N | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 8 | 455 | — | Y | 490 | -35 | QTcF > 450 ms | Y | QTcF > 480 ms | N | QTcF > 500 ms | N | QTcF increase from baseline > 30 ms | N | QTcF increase from baseline > 60 ms | N | |
| YAMAA-01 | QT | QT Interval (ms) | BASELINE | 430 | Y | — | 430 | — | — | — | — | — | — | — | — | — | — | — | |
| YAMAA-01 | QT | QT Interval (ms) | WEEK 2 | 470 | — | Y | 430 | 40 | — | — | — | — | — | — | — | — | — | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 2 | 500 | — | Y | — | — | QTcF > 450 ms | Y | QTcF > 480 ms | Y | QTcF > 500 ms | N | — | — | — | — | |
| YAMAA-01 | QTCF | QTcF Interval (ms) | WEEK 4 | 500.4 | — | Y | — | — | QTcF > 450 ms | Y | QTcF > 480 ms | Y | QTcF > 500 ms | Y | — | — | — | — |
Human review and assessment
| Dataset Name | Variable Name | Variable Label | Type | Codelist/Controlled Terms | Core | Computational Method | Origin |
|---|---|---|---|---|---|---|---|
| ADEG | STUDYID | Study Identifier | character | Copy value from ADEG_RAW.STUDYID. | Predecessor | ||
| ADEG | USUBJID | Unique Subject Identifier | character | Copy value from ADEG_RAW.USUBJID. | Predecessor | ||
| ADEG | PARAMCD | Parameter Code | character | Copy value from ADEG_RAW.PARAMCD. | Predecessor | ||
| ADEG | PARAM | Parameter | character | Copy value from ADEG_RAW.PARAM. | Predecessor | ||
| ADEG | AVISIT | Analysis Visit | character | Copy value from ADEG_RAW.AVISIT. | Predecessor | ||
| ADEG | AVAL | Analysis Value | numeric | Copy value from ADEG_RAW.AVAL. | Predecessor | ||
| ADEG | ABLFL | Baseline Record Flag | character | Y | Copy value from ADEG_RAW.ABLFL. | Predecessor | |
| ADEG | ONTRTFL | On Treatment Record Flag | character | Y | Copy value from ADEG_RAW.ONTRTFL. | Predecessor | |
| ADEG | BASE | Baseline Value | numeric | Copy value from ADEG_RAW.BASE. | Predecessor | ||
| ADEG | CHG | Change from Baseline | numeric | Copy value from ADEG_RAW.CHG. | Predecessor | ||
| ADEG | CRIT1 | Analysis Criterion 1 | character | If PARAMCD = 'QTCF' AND ONTRTFL = 'Y' AND AVAL IS NOT NULL then "QTcF > 450 ms"; otherwise blank. | Derived | ||
| ADEG | CRIT1FL | Criterion 1 Evaluation Result Flag | character | Y, N | If CRIT1 IS NULL then "None"; If AVAL > 450 then "Y"; otherwise "N". | Derived | |
| ADEG | CRIT2 | Analysis Criterion 2 | character | If PARAMCD = 'QTCF' AND ONTRTFL = 'Y' AND AVAL IS NOT NULL then "QTcF > 480 ms"; otherwise blank. | Derived | ||
| ADEG | CRIT2FL | Criterion 2 Evaluation Result Flag | character | Y, N | If CRIT2 IS NULL then "None"; If AVAL > 480 then "Y"; otherwise "N". | Derived | |
| ADEG | CRIT3 | Analysis Criterion 3 | character | If PARAMCD = 'QTCF' AND ONTRTFL = 'Y' AND AVAL IS NOT NULL then "QTcF > 500 ms"; otherwise blank. | Derived | ||
| ADEG | CRIT3FL | Criterion 3 Evaluation Result Flag | character | Y, N | If CRIT3 IS NULL then "None"; If AVAL > 500 then "Y"; otherwise "N". | Derived | |
| ADEG | CRIT4 | Analysis Criterion 4 | character | If PARAMCD = 'QTCF' AND ONTRTFL = 'Y' AND CHG IS NOT NULL then "QTcF increase from baseline > 30 ms"; otherwise blank. | Derived | ||
| ADEG | CRIT4FL | Criterion 4 Evaluation Result Flag | character | Y, N | If CRIT4 IS NULL then "None"; If CHG > 30 then "Y"; otherwise "N". | Derived | |
| ADEG | CRIT5 | Analysis Criterion 5 | character | If PARAMCD = 'QTCF' AND ONTRTFL = 'Y' AND CHG IS NOT NULL then "QTcF increase from baseline > 60 ms"; otherwise blank. | Derived | ||
| ADEG | CRIT5FL | Criterion 5 Evaluation Result Flag | character | Y, N | If CRIT5 IS NULL then "None"; If CHG > 60 then "Y"; otherwise "N". | Derived |
| Variable | Permitted values |
|---|---|
| ABLFL | Y |
| ONTRTFL | Y |
| CRIT1FL | Y, N |
| CRIT2FL | Y, N |
| CRIT3FL | Y, N |
| CRIT4FL | Y, N |
| CRIT5FL | Y, N |
| Version | Date | Author | Description | Reviewer | Sign-off |
|---|---|---|---|---|---|
| 1.7 | 2026-10-20 | yamaa docs build | Read a specification in the 1.0 surface as its 0.5 counterpart; state that missing values stay missing where a mapping declares no missing handler, and leave out a declared missing answer that restates a handler's default | ||
| 1.6 | 2026-10-17 | yamaa docs build | Describe collected date parts written as ISO 8601 date text and times of day counted in seconds since midnight | ||
| 1.5 | 2026-10-17 | yamaa docs build | Name collected precision in words instead of letter codes; state imputation fallbacks, minimum source precision, bounds ignored outside the collected period, and invalid text with no handler as an error; describe date and datetime shifts, imputation flag codes, and partial text giving no date part | ||
| 1.4 | 2026-10-15 | yamaa docs build | State datetime precision codes through the hour and minute, and complete only the time parts a collected datetime lacks | ||
| 1.3 | 2026-09-29 | yamaa docs build | Show study codelist names, external dictionaries, and ISO 8601 formats in variable rows; list the document's codelist values and metadata | ||
| 1.2 | 2026-09-29 | yamaa docs build | Classify ADaM copies from a declared input as Predecessor and recodes as Derived, and SDTM recodes of locally derived columns as Derived | ||
| 1.1 | 2026-09-29 | yamaa docs build | Resolve lookups into the donor record they select, and give every derivation shape a plain-language rule instead of its raw YAML | ||
| 1.0 | yamaa docs build | Initial generation from spec.yaml |
prompts/adam-adeg-qtc-flags/full.md
Edit30 linesFollowing CDISC ADaM standards, use the provided ADEG_RAW dataset to create an ADEG dataset with one record per subject per parameter per analysis visit.
The output dataset should contain the following columns in this order: STUDYID, USUBJID, PARAMCD, PARAM, AVISIT, AVAL, ABLFL, ONTRTFL, BASE, CHG, CRIT1, CRIT1FL, CRIT2, CRIT2FL, CRIT3, CRIT3FL, CRIT4, CRIT4FL, CRIT5, CRIT5FL
Only records with PARAMCD "QTCF" and ONTRTFL "Y" are assessed. Baseline records, records after the on-treatment window, and records of other parameters, such as the uncorrected QT interval, carry no criterion.
- CRIT1 is "QTcF > 450 ms", CRIT2 is "QTcF > 480 ms", and CRIT3 is "QTcF > 500 ms" on an assessed record; each has no value when the record is not assessed or AVAL has no value.
- CRIT1FL is Y when AVAL is above 450, CRIT2FL is Y when AVAL is above 480, and CRIT3FL is Y when AVAL is above 500, each N otherwise, so a value exactly at a limit reads N.
- CRIT4 is "QTcF increase from baseline > 30 ms" and CRIT5 is "QTcF increase from baseline > 60 ms" on an assessed record; each has no value when the record is not assessed or CHG has no value, as on a record with no baseline value, while its absolute criteria are still assessed.
- CRIT4FL is Y when CHG is above 30 and CRIT5FL is Y when CHG is above 60, each N otherwise: an increase of exactly 30 or exactly 60 reads N, and a decrease never reads Y, however large.
- Each flag has no value exactly where its criterion has no value. AVAL and CHG are compared as they stand, without rounding.
Read the source datasets from /app/input and save the completed dataset as /app/output/adeg.csv.
prompts/adam-adeg-qtc-flags/conventions.md
Edit16 linesFollowing CDISC ADaM standards, use the provided ADEG_RAW dataset to create an ADEG dataset with one record per subject per parameter per analysis visit.
The output dataset should contain the following columns in this order: STUDYID, USUBJID, PARAMCD, PARAM, AVISIT, AVAL, ABLFL, ONTRTFL, BASE, CHG, CRIT1, CRIT1FL, CRIT2, CRIT2FL, CRIT3, CRIT3FL, CRIT4, CRIT4FL, CRIT5, CRIT5FL
CRIT1 is "QTcF > 450 ms", CRIT2 is "QTcF > 480 ms", and CRIT3 is "QTcF > 500 ms", or has no value. CRIT4 is "QTcF increase from baseline > 30 ms" and CRIT5 is "QTcF increase from baseline > 60 ms", or has no value. CRIT1FL, CRIT2FL, CRIT3FL, CRIT4FL, and CRIT5FL are Y or N, or have no value. AVAL and CHG are compared as they stand, without rounding.
Read the source datasets from /app/input and save the completed dataset as /app/output/adeg.csv.
prompts/adam-adeg-qtc-flags/brief.md
Edit9 linesFollowing CDISC ADaM standards, use the provided ADEG_RAW dataset to create an ADEG dataset with one record per subject per parameter per analysis visit.
The output dataset should contain the following columns in this order: STUDYID, USUBJID, PARAMCD, PARAM, AVISIT, AVAL, ABLFL, ONTRTFL, BASE, CHG, CRIT1, CRIT1FL, CRIT2, CRIT2FL, CRIT3, CRIT3FL, CRIT4, CRIT4FL, CRIT5, CRIT5FL
Read the source datasets from /app/input and save the completed dataset as /app/output/adeg.csv.
R
Edit3 lineslibrary(yamaa)yamaa_spec("spec.yaml")$run()$outputPython
Edit3 linesimport yamaayamaa.spec("spec.yaml").run().outputsolutions/adam-adeg-qtc-flags/result.R
Edit73 lines# Reference solution for the yamaa benchmark adam-adeg-qtc-flags (R track).## Written from the benchmark's full prompt and its inputs alone, as an agent# would write it. Harbor's oracle agent runs it to check that the prompt can# be solved and that the grader scores a correct answer 1.library(dplyr, warn.conflicts = FALSE)library(readr)raw <- read_csv( "/app/input/adeg_raw.csv", col_types = cols( AVAL = col_double(), BASE = col_double(), CHG = col_double(), .default = col_character() ))# Only on-treatment QTcF records are assessed, and values are compared# unrounded, strictly above each limit: exactly at a limit reads N.absolute <- function(data) { data$PARAMCD %in% "QTCF" & data$ONTRTFL %in% "Y" & !is.na(data$AVAL)}change <- function(data) { data$PARAMCD %in% "QTCF" & data$ONTRTFL %in% "Y" & !is.na(data$CHG)}adeg <- raw |> mutate( CRIT1 = if_else(absolute(raw), "QTcF > 450 ms", NA_character_), CRIT1FL = case_when( !absolute(raw) ~ NA_character_, AVAL > 450 ~ "Y", .default = "N" ), CRIT2 = if_else(absolute(raw), "QTcF > 480 ms", NA_character_), CRIT2FL = case_when( !absolute(raw) ~ NA_character_, AVAL > 480 ~ "Y", .default = "N" ), CRIT3 = if_else(absolute(raw), "QTcF > 500 ms", NA_character_), CRIT3FL = case_when( !absolute(raw) ~ NA_character_, AVAL > 500 ~ "Y", .default = "N" ), CRIT4 = if_else( change(raw), "QTcF increase from baseline > 30 ms", NA_character_ ), CRIT4FL = case_when( !change(raw) ~ NA_character_, CHG > 30 ~ "Y", .default = "N" ), CRIT5 = if_else( change(raw), "QTcF increase from baseline > 60 ms", NA_character_ ), CRIT5FL = case_when( !change(raw) ~ NA_character_, CHG > 60 ~ "Y", .default = "N" ) ) |> select( STUDYID, USUBJID, PARAMCD, PARAM, AVISIT, AVAL, ABLFL, ONTRTFL, BASE, CHG, CRIT1, CRIT1FL, CRIT2, CRIT2FL, CRIT3, CRIT3FL, CRIT4, CRIT4FL, CRIT5, CRIT5FL )dir.create("/app/output", showWarnings = FALSE)write_csv(adeg, "/app/output/adeg.csv", na = "")solutions/adam-adeg-qtc-flags/result.py
Edit82 lines# Reference solution for the yamaa benchmark adam-adeg-qtc-flags (Python track).## Written from the benchmark's full prompt and its inputs alone, as an agent# would write it. Harbor's oracle agent runs it to check that the prompt can# be solved and that the grader scores a correct answer 1."""Create the ADEG dataset with QTcF criterion flags from ADEG_RAW.Only records with PARAMCD "QTCF" and ONTRTFL "Y" are assessed. Theabsolute criteria compare AVAL against 450, 480 and 500 ms; theincrease criteria compare CHG against 30 and 60 ms. A flag is Y onlywhen the value is strictly above its limit, N otherwise, and eachcriterion and flag has no value when the record is not assessed orthe compared value has no value. Values are compared as they stand,without rounding."""import csvINPUT_PATH = "/app/input/adeg_raw.csv"OUTPUT_PATH = "/app/output/adeg.csv"COLUMNS = [ "STUDYID", "USUBJID", "PARAMCD", "PARAM", "AVISIT", "AVAL", "ABLFL", "ONTRTFL", "BASE", "CHG", "CRIT1", "CRIT1FL", "CRIT2", "CRIT2FL", "CRIT3", "CRIT3FL", "CRIT4", "CRIT4FL", "CRIT5", "CRIT5FL",]ABSOLUTE = [ ("CRIT1", "CRIT1FL", "QTcF > 450 ms", 450.0), ("CRIT2", "CRIT2FL", "QTcF > 480 ms", 480.0), ("CRIT3", "CRIT3FL", "QTcF > 500 ms", 500.0),]INCREASE = [ ("CRIT4", "CRIT4FL", "QTcF increase from baseline > 30 ms", 30.0), ("CRIT5", "CRIT5FL", "QTcF increase from baseline > 60 ms", 60.0),]def number(text): """The numeric value of a cell, or None when it has no value.""" if text is None or text.strip() == "": return None return float(text)def main(): with open(INPUT_PATH, newline="") as handle: rows = list(csv.DictReader(handle)) out_rows = [] for row in rows: out = {column: row.get(column, "") for column in COLUMNS[:10]} assessed = row.get("PARAMCD") == "QTCF" and row.get("ONTRTFL") == "Y" aval = number(row.get("AVAL")) chg = number(row.get("CHG")) for crit, flag, label, limit in ABSOLUTE: if assessed and aval is not None: out[crit] = label out[flag] = "Y" if aval > limit else "N" else: out[crit] = "" out[flag] = "" for crit, flag, label, limit in INCREASE: if assessed and chg is not None: out[crit] = label out[flag] = "Y" if chg > limit else "N" else: out[crit] = "" out[flag] = "" out_rows.append(out) with open(OUTPUT_PATH, "w", newline="") as handle: writer = csv.DictWriter(handle, fieldnames=COLUMNS) writer.writeheader() writer.writerows(out_rows)if __name__ == "__main__": main()solutions/adam-adeg-qtc-flags/result.sas
Edit32 lines/* opensas reference solution for the yamaa benchmark adam-adeg-qtc-flags. Reads the benchmark inputs and derives the requested output. Execute with the existing opensas runtime: opensas /app/output/result.sas. */data adeg; length STUDYID USUBJID PARAMCD PARAM AVISIT ABLFL ONTRTFL $1024; infile "/app/input/adeg_raw.csv" dsd dlm="," firstobs=2 truncover lrecl=32767; input STUDYID : $char1024. USUBJID : $char1024. PARAMCD : $char1024. PARAM : $char1024. AVISIT : $char1024. AVAL ABLFL : $char1024. ONTRTFL : $char1024. BASE CHG;run;data result; length CRIT1 CRIT2 CRIT3 CRIT4 CRIT5 $1024 CRIT1FL CRIT2FL CRIT3FL CRIT4FL CRIT5FL $1; set adeg; CRIT1=''; CRIT1FL=''; CRIT2=''; CRIT2FL=''; CRIT3=''; CRIT3FL=''; CRIT4=''; CRIT4FL=''; CRIT5=''; CRIT5FL=''; /* Only on-treatment QTcF records are assessed, and values are compared unrounded, strictly above each limit: exactly at a limit reads N. */ if PARAMCD='QTCF' and ONTRTFL='Y' and not missing(AVAL) then do; CRIT1='QTcF > 450 ms'; CRIT1FL=ifc(AVAL>450,'Y','N'); CRIT2='QTcF > 480 ms'; CRIT2FL=ifc(AVAL>480,'Y','N'); CRIT3='QTcF > 500 ms'; CRIT3FL=ifc(AVAL>500,'Y','N'); end; if PARAMCD='QTCF' and ONTRTFL='Y' and not missing(CHG) then do; CRIT4='QTcF increase from baseline > 30 ms'; CRIT4FL=ifc(CHG>30,'Y','N'); CRIT5='QTcF increase from baseline > 60 ms'; CRIT5FL=ifc(CHG>60,'Y','N'); end;run;proc sql; create table final as select STUDYID, USUBJID, PARAMCD, PARAM, AVISIT, AVAL, ABLFL, ONTRTFL, BASE, CHG, CRIT1, CRIT1FL, CRIT2, CRIT2FL, CRIT3, CRIT3FL, CRIT4, CRIT4FL, CRIT5, CRIT5FL from result;quit;proc export data=final outfile="/app/output/adeg.csv" dbms=csv replace; run;
yamaa