diff --git a/inst/templates/ad_adee.R b/inst/templates/ad_adee.R new file mode 100644 index 00000000..8c4a7980 --- /dev/null +++ b/inst/templates/ad_adee.R @@ -0,0 +1,249 @@ +# Name: ADEE +# +# Label: Exposure Efficacy Response Data +# +# Input: adsl, adtte, adlb, advs, adex, adpp +# Load required packages +library(admiral) +library(admiralonco) +# pharmaverseadam contains example datasets generated from the CDISC pilot +# project SDTM ran through admiral templates +library(pharmaverseadam) +library(dplyr) +library(lubridate) +library(stringr) + +# Load source datasets ---- + +# Use e.g. haven::read_sas to read in .sas7bdat, or other suitable functions +# as needed and assign to the variables below. +# For illustration purposes read in admiral test data + +adsl <- pharmaverseadam::adsl +adtte <- pharmaverseadam::adtte_onco +adlb <- pharmaverseadam::adlb +advs <- pharmaverseadam::advs +adpp <- pharmaverseadam::adpp + +# ---- Prepare adsl - add derived variables + +# Ensure TRT01P/TRT01A exist +if (!"TRT01P" %in% names(adsl)) { + adsl <- adsl %>% mutate(TRT01P = ARM) +} +if (!"TRT01A" %in% names(adsl)) { + adsl <- adsl %>% mutate(TRT01A = ACTARM) +} + +# Create numeric treatment variables +adsl <- adsl %>% + mutate( + TRT01PN = case_when( + TRT01P == "Placebo" ~ 0, + TRT01P == "Xanomeline Low Dose" ~ 1, + TRT01P == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ), + TRT01AN = case_when( + TRT01A == "Placebo" ~ 0, + TRT01A == "Xanomeline Low Dose" ~ 1, + TRT01A == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ) + ) + +# Ensure PARAMN exists in ADTTE +if (!"PARAMN" %in% names(adtte)) { + adtte <- adtte %>% + mutate( + PARAMN = case_when( + PARAMCD == "PFS" ~ 1, + PARAMCD == "OS" ~ 2, + PARAMCD == "TTP" ~ 3, + PARAMCD == "TTNT" ~ 4, + TRUE ~ 99 + ) + ) +} + +# ---- Derive Baseline Covariates + +## Numeric identifiers and demographics ---- + +adsl_cov <- adsl %>% + mutate( + # Study identifiers (numeric) + STUDYIDN = as.numeric(word(USUBJID, 1, sep = fixed("-"))), + SITEIDN = as.numeric(word(USUBJID, 2, sep = fixed("-"))), + USUBJIDN = as.numeric(word(USUBJID, 3, sep = fixed("-"))), + SUBJIDN = as.numeric(SUBJID), + + # Demographics (numeric) + SEXN = case_when(SEX == "M" ~ 1, SEX == "F" ~ 2, TRUE ~ 3), + RACEN = case_when( + RACE == "AMERICAN INDIAN OR ALASKA NATIVE" ~ 1, + RACE == "ASIAN" ~ 2, + RACE == "BLACK OR AFRICAN AMERICAN" ~ 3, + RACE == "NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER" ~ 4, + RACE == "WHITE" ~ 5, + TRUE ~ 6 + ), + ETHNICN = case_when( + ETHNIC == "HISPANIC OR LATINO" ~ 1, + ETHNIC == "NOT HISPANIC OR LATINO" ~ 2, + TRUE ~ 3 + ), + + # Age groups + AGEGR1 = case_when( + AGE < 65 ~ "<65", + AGE >= 65 & AGE < 75 ~ "65-75", + AGE >= 75 ~ ">75", + TRUE ~ NA_character_ + ), + AGEGR1N = case_when( + AGE < 65 ~ 1, + AGE >= 65 & AGE < 75 ~ 2, + AGE >= 75 ~ 3, + TRUE ~ NA_real_ + ), + + # Treatment (numeric) + ARMN = case_when( + ARM == "Placebo" ~ 0, + ARM == "Xanomeline Low Dose" ~ 1, + ARM == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ), + ACTARMN = case_when( + ACTARM == "Placebo" ~ 0, + ACTARM == "Xanomeline Low Dose" ~ 1, + ACTARM == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ) + ) + +## Add baseline vitals ---- + +adsl_vs <- adsl_cov %>% + derive_vars_merged( + dataset_add = advs, + filter_add = PARAMCD == "HEIGHT" & ABLFL == "Y", + by_vars = exprs(STUDYID, USUBJID), + new_vars = exprs(HTBL = AVAL) + ) %>% + derive_vars_merged( + dataset_add = advs, + filter_add = PARAMCD == "WEIGHT" & ABLFL == "Y", + by_vars = exprs(STUDYID, USUBJID), + new_vars = exprs(WTBL = AVAL) + ) %>% + mutate( + BMIBL = compute_bmi(height = HTBL, weight = WTBL), + BSABL = compute_bsa(height = HTBL, weight = WTBL, method = "Mosteller"), + WTBLGR1 = case_when( + WTBL < 70 ~ "<70 kg", + WTBL >= 70 ~ ">=70 kg", + TRUE ~ NA_character_ + ) + ) + +## Add baseline labs ---- + +labs_bl <- adlb %>% + filter(ABLFL == "Y" & PARAMCD %in% c("CREAT", "ALT", "AST", "BILI", "ALB")) %>% + mutate(PARAMCDB = paste0(PARAMCD, "BL")) %>% + select(STUDYID, USUBJID, PARAMCDB, AVAL) + +adsl_vslb <- adsl_vs %>% + derive_vars_transposed( + dataset_merge = labs_bl, + by_vars = exprs(STUDYID, USUBJID), + key_var = PARAMCDB, + value_var = AVAL + ) %>% + mutate( + TBILBL = BILIBL, + CRCLBL = compute_egfr( + creat = CREATBL, creatu = "SI", age = AGE, + weight = WTBL, sex = SEX, method = "CRCL" + ), + EGFRBL = compute_egfr( + creat = CREATBL, creatu = "SI", age = AGE, + weight = WTBL, sex = SEX, method = "CKD-EPI" + ) + ) %>% + select(-BILIBL) + +# ---- Derive Exposure Metrics + +exposure_final <- adsl_vslb %>% + derive_vars_transposed( + dataset_merge = adpp, + filter = PARAMCD %in% c("AUCLST", "CMAX"), + by_vars = get_admiral_option("subject_keys"), + key_var = PARAMCD, + value_var = AVAL + ) %>% + rename(AUCSS = AUCLST, CMAXSS = CMAX) + +# ---- Create adee base dataset + +# Get variable names from both datasets +adsl_vars <- names(exposure_final) +adtte_vars <- names(adtte) + +# Find common variables +common_vars <- intersect(adsl_vars, adtte_vars) + +# Remove key variables to get variables to drop +vars_to_drop <- setdiff(common_vars, c("STUDYID", "USUBJID")) + +adee_base <- adtte %>% + # Filter to efficacy endpoints + filter(PARAMCD %in% c("OS", "PFS", "TTP", "TTNT")) %>% + # Add derived variables + mutate( + EVENT = 1 - CNSR, + AVALU = if_else(!is.na(AVAL), "DAYS", NA_character_), + ) %>% + # Remove overlapping variables (use clean method) + select(-any_of(vars_to_drop)) %>% + # Merge exposure and covariates + derive_vars_merged( + dataset_add = exposure_final, + by_vars = exprs(STUDYID, USUBJID) + ) + +# ---- Add Anaylsis variables + +adee <- adee_base %>% + # Analysis flags + mutate( + ANL01FL = if_else(PARAMCD == "PFS", "Y", ""), + ANL02FL = if_else(PARAMCD == "OS", "Y", ""), + ANL03FL = if_else(PARAMCD == "TTP", "Y", ""), + ANL04FL = if_else(PARAMCD == "TTNT", "Y", "") + ) %>% + # Parameter categories + mutate( + PARCAT1 = "EFFICACY", + PARCAT2 = "TIME TO EVENT" + ) %>% + # Sequence number + derive_var_obs_number( + by_vars = exprs(STUDYID, USUBJID), + order = exprs(PARAMN), + new_var = ASEQ, + check_type = "error" + ) + +# Save output ---- + +# Change to whichever directory you want to save the dataset in +dir <- tools::R_user_dir("admiralonco_templates_data", which = "cache") +if (!file.exists(dir)) { + # Create the folder + dir.create(dir, recursive = TRUE, showWarnings = FALSE) +} +save(adee, file = file.path(dir, "adee.rda"), compress = "bzip2") diff --git a/inst/templates/ad_ader.R b/inst/templates/ad_ader.R new file mode 100644 index 00000000..e85c4ce0 --- /dev/null +++ b/inst/templates/ad_ader.R @@ -0,0 +1,206 @@ +# Name: ADER +# +# Label: Exposure Response Data +# +# Input: adsl, adrs, adtte, adlb, advs, adex +library(admiral) +library(admiralonco) +# pharmaverseadam contains example datasets generated from the CDISC pilot +# project SDTM ran through admiral templates +library(pharmaverseadam) +library(dplyr) +library(lubridate) +library(stringr) + +# Load source datasets ---- + +# Use e.g. haven::read_sas to read in .sas7bdat, or other suitable functions +# as needed and assign to the variables below. +# For illustration purposes read in data from pharmaverseadam + +adsl <- pharmaverseadam::adsl +adrs <- pharmaverseadam::adrs_onco +adtte <- pharmaverseadam::adtte_onco +adlb <- pharmaverseadam::adlb +advs <- pharmaverseadam::advs +adex <- pharmaverseadam::adex %>% + filter(PARCAT1 == "INDIVIDUAL") + +adpp <- pharmaverseadam::adpp + +# Derivations ---- + +# For ADTTE censor variables add "IND" to PARAMCD +adttei <- adtte %>% + mutate(PARAMCD = paste0(PARAMCD, "IND")) + +ader_tte <- adsl %>% + select(!!!get_admiral_option("subject_keys")) %>% + # Create OS and PFS variables from ADTTE + derive_vars_transposed( + dataset_merge = adtte, + by_vars = get_admiral_option("subject_keys"), + key_var = PARAMCD, + value_var = AVAL + ) %>% + # Create OS and PFS censor variables + derive_vars_transposed( + dataset_merge = adttei, + by_vars = get_admiral_option("subject_keys"), + key_var = PARAMCD, + value_var = CNSR + ) + +# Derive Best Overall Response (BOR) variables from ADRS +ader_bor <- ader_tte %>% + derive_vars_merged( + dataset_add = adrs, + filter_add = PARAMCD == "BOR" & ANL01FL == "Y", + by_vars = get_admiral_option("subject_keys"), + new_vars = exprs(BOR = AVAL, BORC = AVALC) + ) + +# Add exposure metrics + +ader_auc <- ader_bor %>% + derive_vars_transposed( + dataset_merge = adpp, + filter = PARAMCD %in% c("AUCLST", "CMAX"), + by_vars = get_admiral_option("subject_keys"), + key_var = PARAMCD, + value_var = AVAL + ) %>% + rename(AUCSS = AUCLST, CMAXSS = CMAX) + +# Add Sequence number + +ader_aseq <- ader_auc %>% + derive_var_obs_number( + by_vars = get_admiral_option("subject_keys"), + check_type = "error" + ) + +# ---- Derive Covariates ---- +# Include numeric values for STUDYIDN, USUBJIDN, SEXN, RACEN etc. + +covar <- adsl %>% + derive_vars_merged( + dataset_add = country_code_lookup, + new_vars = exprs(COUNTRYN = country_number, COUNTRYL = country_name), + by_vars = exprs(COUNTRY = country_code) + ) %>% + mutate( + STUDYIDN = as.numeric(word(USUBJID, 1, sep = fixed("-"))), + SITEIDN = as.numeric(word(USUBJID, 2, sep = fixed("-"))), + USUBJIDN = as.numeric(word(USUBJID, 3, sep = fixed("-"))), + SUBJIDN = as.numeric(SUBJID), + SEXN = case_when( + SEX == "M" ~ 1, + SEX == "F" ~ 2, + TRUE ~ 3 + ), + RACEN = case_when( + RACE == "AMERICAN INDIAN OR ALASKA NATIVE" ~ 1, + RACE == "ASIAN" ~ 2, + RACE == "BLACK OR AFRICAN AMERICAN" ~ 3, + RACE == "NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER" ~ 4, + RACE == "WHITE" ~ 5, + TRUE ~ 6 + ), + ETHNICN = case_when( + ETHNIC == "HISPANIC OR LATINO" ~ 1, + ETHNIC == "NOT HISPANIC OR LATINO" ~ 2, + TRUE ~ 3 + ), + ARMN = case_when( + ARM == "Placebo" ~ 0, + ARM == "Xanomeline Low Dose" ~ 1, + ARM == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ), + ACTARMN = case_when( + ACTARM == "Placebo" ~ 0, + ACTARM == "Xanomeline Low Dose" ~ 1, + ACTARM == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ), + COHORT = ARMN, + COHORTC = ARM, + ROUTE = unique(adex$EXROUTE)[1], + ROUTEN = case_when( + ROUTE == "TRANSDERMAL" ~ 3, + TRUE ~ NA_real_ + ), + FORM = unique(adex$EXDOSFRM)[1], + FORMN = case_when( + FORM == "PATCH" ~ 3, + TRUE ~ 4 + ) + ) %>% + select( + STUDYID, STUDYIDN, SITEID, SITEIDN, USUBJID, USUBJIDN, + SUBJID, SUBJIDN, AGE, SEX, SEXN, COHORT, COHORTC, ROUTE, ROUTEN, + RACE, RACEN, ETHNIC, ETHNICN, FORM, FORMN, COUNTRY, COUNTRYN, COUNTRYL + ) + +# ---- Derive additional baselines from ADVS and ADLB ---- + +labsbl <- adlb %>% + filter(ABLFL == "Y" & PARAMCD %in% c("CREAT", "ALT", "AST", "BILI")) %>% + mutate(PARAMCDB = paste0(PARAMCD, "BL")) %>% + select(STUDYID, USUBJID, PARAMCDB, AVAL) + +covar_vslb <- covar %>% + derive_vars_merged( + dataset_add = advs, + filter_add = PARAMCD == "HEIGHT" & ABLFL == "Y", + by_vars = exprs(STUDYID, USUBJID), + new_vars = exprs(HTBL = AVAL) + ) %>% + derive_vars_merged( + dataset_add = advs, + filter_add = PARAMCD == "WEIGHT" & ABLFL == "Y", + by_vars = exprs(STUDYID, USUBJID), + new_vars = exprs(WTBL = AVAL) + ) %>% + derive_vars_transposed( + dataset_merge = labsbl, + by_vars = exprs(STUDYID, USUBJID), + key_var = PARAMCDB, + value_var = AVAL + ) %>% + mutate( + BMIBL = compute_bmi(height = HTBL, weight = WTBL), + BSABL = compute_bsa( + height = HTBL, + weight = WTBL, + method = "Mosteller" + ), + CRCLBL = compute_egfr( + creat = CREATBL, creatu = "SI", age = AGE, weight = WTBL, sex = SEX, + method = "CRCL" + ), + EGFRBL = compute_egfr( + creat = CREATBL, creatu = "SI", age = AGE, weight = WTBL, sex = SEX, + method = "CKD-EPI" + ) + ) %>% + rename(TBILBL = BILIBL) + +# Combine covariates with ADER data + +ader <- ader_aseq %>% + derive_vars_merged( + dataset_add = covar_vslb, + by_vars = exprs(STUDYID, USUBJID) + ) + +# Save output ---- + +# Change to whichever directory you want to save the dataset in +dir <- tools::R_user_dir("admiralonco_templates_data", which = "cache") +if (!file.exists(dir)) { + # Create the folder + dir.create(dir, recursive = TRUE, showWarnings = FALSE) +} +save(ader, file = file.path(dir, "ader.rda"), compress = "bzip2") diff --git a/inst/templates/ad_adtrr.R b/inst/templates/ad_adtrr.R new file mode 100644 index 00000000..703f84ab --- /dev/null +++ b/inst/templates/ad_adtrr.R @@ -0,0 +1,326 @@ +# Name: ADTRR +# +# Label: Exposure Tumor Response Data +# +# Input: adsl, adtr, adlb, advs, adex, adpp +# Load required packages +library(admiral) +library(admiralonco) +# pharmaverseadam contains example datasets generated from the CDISC pilot +# project SDTM ran through admiral templates +library(pharmaverseadam) +library(dplyr) +library(lubridate) +library(stringr) + +# Load source datasets ---- + +# Use e.g. haven::read_sas to read in .sas7bdat, or other suitable functions +# as needed and assign to the variables below. +# For illustration purposes read in data from pharmaverseadam + +adsl <- pharmaverseadam::adsl +adrs <- pharmaverseadam::adrs_onco +adtr <- pharmaverseadam::adtr_onco +adlb <- pharmaverseadam::adlb +advs <- pharmaverseadam::advs +adpp <- pharmaverseadam::adpp + +# ---- Prepare adsl - add derived variables + +# Ensure TRT01P/TRT01A exist +if (!"TRT01P" %in% names(adsl)) { + adsl <- adsl %>% mutate(TRT01P = ARM) +} +if (!"TRT01A" %in% names(adsl)) { + adsl <- adsl %>% mutate(TRT01A = ACTARM) +} + +# Create numeric treatment variables +adsl <- adsl %>% + mutate( + TRT01PN = case_when( + TRT01P == "Placebo" ~ 0, + TRT01P == "Xanomeline Low Dose" ~ 1, + TRT01P == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ), + TRT01AN = case_when( + TRT01A == "Placebo" ~ 0, + TRT01A == "Xanomeline Low Dose" ~ 1, + TRT01A == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ) + ) + +# ---- Derive Baseline Covariates + +## Numeric identifiers and demographics ---- + +adsl_cov <- adsl %>% + filter(SAFFL == "Y") %>% + mutate( + # Study identifiers (numeric) + STUDYIDN = as.numeric(word(USUBJID, 1, sep = fixed("-"))), + SITEIDN = as.numeric(word(USUBJID, 2, sep = fixed("-"))), + USUBJIDN = as.numeric(word(USUBJID, 3, sep = fixed("-"))), + SUBJIDN = as.numeric(SUBJID), + + # Demographics (numeric) + SEXN = case_when(SEX == "M" ~ 1, SEX == "F" ~ 2, TRUE ~ 3), + RACEN = case_when( + RACE == "AMERICAN INDIAN OR ALASKA NATIVE" ~ 1, + RACE == "ASIAN" ~ 2, + RACE == "BLACK OR AFRICAN AMERICAN" ~ 3, + RACE == "NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER" ~ 4, + RACE == "WHITE" ~ 5, + TRUE ~ 6 + ), + ETHNICN = case_when( + ETHNIC == "HISPANIC OR LATINO" ~ 1, + ETHNIC == "NOT HISPANIC OR LATINO" ~ 2, + TRUE ~ 3 + ), + + # Age groups + AGEGR1 = case_when( + AGE < 65 ~ "<65", + AGE >= 65 & AGE < 75 ~ "65-75", + AGE >= 75 ~ ">75", + TRUE ~ NA_character_ + ), + AGEGR1N = case_when( + AGE < 65 ~ 1, + AGE >= 65 & AGE < 75 ~ 2, + AGE >= 75 ~ 3, + TRUE ~ NA_real_ + ), + + # Treatment (numeric) + ARMN = case_when( + ARM == "Placebo" ~ 0, + ARM == "Xanomeline Low Dose" ~ 1, + ARM == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ), + ACTARMN = case_when( + ACTARM == "Placebo" ~ 0, + ACTARM == "Xanomeline Low Dose" ~ 1, + ACTARM == "Xanomeline High Dose" ~ 2, + TRUE ~ 3 + ) + ) + +## Add baseline vitals ---- + +adsl_vs <- adsl_cov %>% + derive_vars_merged( + dataset_add = advs, + filter_add = PARAMCD == "HEIGHT" & ABLFL == "Y", + by_vars = exprs(STUDYID, USUBJID), + new_vars = exprs(HTBL = AVAL) + ) %>% + derive_vars_merged( + dataset_add = advs, + filter_add = PARAMCD == "WEIGHT" & ABLFL == "Y", + by_vars = exprs(STUDYID, USUBJID), + new_vars = exprs(WTBL = AVAL) + ) %>% + mutate( + BMIBL = compute_bmi(height = HTBL, weight = WTBL), + BSABL = compute_bsa(height = HTBL, weight = WTBL, method = "Mosteller"), + WTBLGR1 = case_when( + WTBL < 70 ~ "<70 kg", + WTBL >= 70 ~ ">=70 kg", + TRUE ~ NA_character_ + ) + ) + +## Add baseline labs ---- + +labs_bl <- adlb %>% + filter(ABLFL == "Y" & PARAMCD %in% c("CREAT", "ALT", "AST", "BILI", "ALB")) %>% + mutate(PARAMCDB = paste0(PARAMCD, "BL")) %>% + select(STUDYID, USUBJID, PARAMCDB, AVAL) + +adsl_vslb <- adsl_vs %>% + derive_vars_transposed( + dataset_merge = labs_bl, + by_vars = exprs(STUDYID, USUBJID), + key_var = PARAMCDB, + value_var = AVAL + ) %>% + mutate( + TBILBL = BILIBL, + CRCLBL = compute_egfr( + creat = CREATBL, creatu = "SI", age = AGE, + weight = WTBL, sex = SEX, method = "CRCL" + ), + EGFRBL = compute_egfr( + creat = CREATBL, creatu = "SI", age = AGE, + weight = WTBL, sex = SEX, method = "CKD-EPI" + ) + ) %>% + select(-BILIBL) +# ---- Derive Exposure Metrics + +exposure_final <- adsl_vslb %>% + derive_vars_transposed( + dataset_merge = adpp, + filter = PARAMCD %in% c("AUCLST", "CMAX"), + by_vars = get_admiral_option("subject_keys"), + key_var = PARAMCD, + value_var = AVAL + ) %>% + rename(AUCSS = AUCLST, CMAXSS = CMAX) + +# ---- Create tumor size parameter dataset + +# Get variable names for clean dropping +adsl_vars <- names(exposure_final) +adtr_vars <- names(adtr) +common_vars <- intersect(adsl_vars, adtr_vars) +vars_to_drop <- setdiff(common_vars, c("STUDYID", "USUBJID")) + +tsize_final <- adtr %>% + filter(PARAMCD == "SDIAM") %>% + mutate( + PARAMCD = "TSIZE", + PARAM = "Target Lesions Sum of Diameters", + PARAMN = 1 + ) %>% + derive_var_nfrlt( + new_var = NFRLT, + new_var_unit = FRLTU, + out_unit = "HOURS", + visit_day = ADY + ) %>% + select(-any_of(vars_to_drop)) %>% + derive_vars_merged( + dataset_add = exposure_final, + by_vars = exprs(STUDYID, USUBJID) + ) + +# ---- Add BOR from ADRS + +adrs_vars <- names(adrs) +common_vars_adrs <- intersect(adsl_vars, adrs_vars) +vars_to_drop_adrs <- setdiff(common_vars_adrs, c("STUDYID", "USUBJID")) + +bor <- adrs %>% + filter(PARAMCD == "BOR" & SAFFL == "Y") %>% + mutate( + PARAMN = 2, + # Create BORN from AVALC if AVAL doesn't exist + BORN = if ("AVAL" %in% names(.)) { + AVAL + } else { + case_when( + AVALC == "CR" ~ 4, + AVALC == "PR" ~ 3, + AVALC == "SD" ~ 2, + AVALC == "PD" ~ 1, + AVALC == "NE" ~ 0, + TRUE ~ NA_real_ + ) + } + ) %>% + select(-any_of(vars_to_drop_adrs)) %>% + derive_vars_merged( + dataset_add = exposure_final, + by_vars = exprs(STUDYID, USUBJID) + ) + +# ---- Derive Nadir + +# Calculate nadir from TSIZE records +# Keep BASE, CHG, PCHG from the nadir timepoint +nadir <- tsize_final %>% + filter(AVISITN > 0 & !is.na(AVAL)) %>% + group_by(STUDYID, USUBJID) %>% + filter(AVAL == min(AVAL, na.rm = TRUE)) %>% + slice(1) %>% + ungroup() %>% + mutate( + PARAMCD = "NADIR", + PARAM = "Nadir Tumor Size", + PARAMN = 3, + NADIR = AVAL, + NADPCHG = PCHG, # Keep PCHG at nadir + NADVST = AVISIT # Keep visit of nadir + ) + +# ---- Combine parameters + +adtrr_base <- bind_rows( + tsize_final, + bor, + nadir +) %>% + arrange(USUBJID, PARAMN, AVISITN) + +# ---- Add analysis variables + +# Ensure AVALU exists before mutating +if (!"AVALU" %in% names(adtrr_base)) { + adtrr_base <- adtrr_base %>% + mutate(AVALU = NA_character_) +} + +adtrr <- adtrr_base %>% + # Analysis flags + mutate( + # Baseline flag + ABLFL = case_when( + !is.na(ABLFL) ~ ABLFL, + !is.na(AVISITN) & AVISITN == 0 ~ "Y", + TRUE ~ "" + ), + + # Post-baseline flag + ANL01FL = if_else(!is.na(AVISITN) & AVISITN > 0, "Y", ""), + + # Responders (CR or PR) + ANL02FL = if_else(!is.na(AVALC) & AVALC %in% c("CR", "PR"), "Y", ""), + + # Has change from baseline + ANL03FL = if_else(!is.na(PCHG), "Y", "") + ) %>% + # Parameter categories + mutate( + PARCAT1 = "TUMOR RESPONSE", + PARCAT2 = case_when( + PARAMCD == "TSIZE" ~ "MEASUREMENT", + PARAMCD == "BOR" ~ "OVERALL RESPONSE", + PARAMCD == "NADIR" ~ "BEST RESPONSE", + TRUE ~ NA_character_ + ) + ) %>% + # Set AVALU (now guaranteed to exist) + mutate( + AVALU = case_when( + !is.na(AVALU) & AVALU != "" ~ AVALU, # Keep existing non-empty + PARAMCD == "TSIZE" ~ "mm", + PARAMCD == "NADIR" ~ "mm", + TRUE ~ NA_character_ + ) + ) %>% + # Sequence number + derive_var_obs_number( + by_vars = exprs(STUDYID, USUBJID), + order = exprs(PARAMN, AVISITN), + new_var = ASEQ, + check_type = "error" + ) %>% + select(-DOMAIN, -all_of(c(starts_with("RS"), starts_with("TR"), starts_with("TU")))) %>% + arrange(USUBJID, PARAMN, AVISITN) + +# Save output ---- + +# Change to whichever directory you want to save the dataset in +dir <- tools::R_user_dir("admiralonco_templates_data", which = "cache") +if (!file.exists(dir)) { + # Create the folder + dir.create(dir, recursive = TRUE, showWarnings = FALSE) +} +save(adtrr, file = file.path(dir, "adtrr.rda"), compress = "bzip2")