← CDISC notebook index

Generate ADSL in R

Open In Colab

library(glue)
library(tidyverse)
library(haven)
library(assertthat)
library(huxtable)
library(data.table)
library(lubridate)
library(pharmaRTF)
load("Data_Need_forADSL.RData")
ls()
  1. 'dm'
  2. 'ds'
  3. 'suppdm'
  4. 'vs'

Merge DM and SUPPDM

Transponse SUPPDM data such that each QNAM becomes a variable

suppdm01 <- suppdm %>%
    mutate(qnam=str_to_lower(qnam)) %>%
    group_by(studyid, usubjid) %>%
    pivot_wider(id_cols=c(studyid,usubjid),names_from = qnam, values_from = qval)

dm01 <- left_join(dm, suppdm01, by = c("studyid", "usubjid"))
dm01

Create variables that are directly based on input variables

adsl01 <- dm01 %>%

    # Planned and actual treatment values;

mutate(trt01p = if_else(armcd == "PBO", "Placebo", if_else(armcd == "ACTIVE", "Active", "")),
       trt01a = if_else(actarmcd == "PBO", "Placebo", if_else(actarmcd == "ACTIVE", "Active", "")),
       trt01pn = if_else(armcd == "PBO", 1, if_else(armcd == "ACTIVE", 2, NA)),
       trt01an = if_else(actarmcd == "PBO", 1, if_else(actarmcd == "ACTIVE", 2, NA))) %>%

    # Date conversions

mutate(tr01sdt = as.Date(rfxstdtc),
tr01edt = as.Date(rfxendtc),
rficdt = as.Date(rficdtc),
lstalvdt = as.Date(rfpendtc),
dthdt = as.Date(dthdtc),
trtsdt = tr01sdt,
trtedt = tr01edt) %>%

    # Grouping variables
mutate(agegr1 = if_else(!is.na(age) & age < 60, "< 60 Years",
if_else(age >= 60, ">= 60 Years", "")),
agegr1n = if_else(!is.na(age) & age < 60, 1, if_else(age >= 60, 2,NA)))
 select(adsl01, c('usubjid', 'trt01p','trt01a','trt01pn', 'trt01an','agegr1','agegr1n', 'ethnic'))
A tibble: 8 × 8
usubjidtrt01ptrt01atrt01pntrt01anagegr1agegr1nethnic
<chr><chr><chr><dbl><dbl><chr><dbl><chr>
CSG001-1001 NANA< 60 Years 1HISPANIC OR LATINO
CSG001-1002 NANA< 60 Years 1NOT HISPANIC OR LATINO
CSG001-1003Placebo 1NA< 60 Years 1HISPANIC OR LATINO
CSG001-1004Active Active 2 2< 60 Years 1HISPANIC OR LATINO
CSG001-1005Active Placebo 2 1>= 60 Years2NOT HISPANIC OR LATINO
CSG001-1006PlaceboPlacebo 1 1>= 60 Years2NOT HISPANIC OR LATINO
CSG001-1007PlaceboPlacebo 1 1< 60 Years 1NOT HISPANIC OR LATINO
CSG001-1008Active Active 2 2>= 60 Years2NOT HISPANIC OR LATINO

Process disposition data for treatment and study status

Enrollment

enrl01 <- ds %>%
filter(dsterm == "ENROLLED") %>%
mutate(enrldt = as.Date(dsstdtc)) %>%
select(studyid, usubjid, enrldt)

Randomization

rand01 <- ds %>%
filter(dsterm == "RANDOMIZED") %>%
mutate(randdt = as.Date(dsstdtc)) %>%
select(studyid, usubjid, randdt)

End of treatment

eot01 <- ds %>%
 filter(dsscat == "END OF TREATMENT") %>%
 mutate(
 eotstt = case_when(
 dsdecod == "COMPLETED" ~ "COMPLETED",
 dsdecod != "" ~ "DISCONTINUED",
 TRUE ~ NA
 ),
 dctreas = if_else(dsdecod != "COMPLETED", dsdecod, NA),
 ineot = 1
 ) %>%
 select(studyid, usubjid, eotstt, dctreas, ineot)

End of study;

eos01 <- ds %>%
 filter(dsscat == "END OF STUDY") %>%
 mutate(
 eosstt = case_when(
 dsdecod == "COMPLETED" ~ "COMPLETED",
 dsdecod != "" ~ "DISCONTINUED",
 TRUE ~ NA
 ),
 dcsreas = if_else(dsdecod != "COMPLETED", dsdecod, NA),
 eosdt = as.Date(dsstdtc),
 ineos = 1
 ) %>%
 select(studyid, usubjid, eosstt, dcsreas, eosdt, ineos)

Baseline variables from vital signs;

heightbl <- vs %>%
 filter(vsblfl == "Y" & vstestcd == "HEIGHT") %>%
 select(studyid, usubjid, vsstresn) %>%
 rename(heightbl = vsstresn)

weightbl <- vs %>%
 filter(vsblfl == "Y" & vstestcd == "WEIGHT") %>%
 select(studyid, usubjid, vsstresn) %>%
 rename(weightbl = vsstresn)

Bring disposition and vital signs related info into parent dataset;

library(purrr)

data_frames <- list(adsl01, eot01, eos01, enrl01, rand01, heightbl, weightbl)

adsl02 <- reduce(data_frames, left_join, by = c("studyid", "usubjid"))

Create variables/assign values to existing variables which are dependent on their variables;


adsl03 <- adsl02 %>%
 mutate(
 saffl = if_else(!is.na(trtsdt), "Y", "N"),
 randfl = if_else(!is.na(randdt), "Y", "N"),
 enrlfl = if_else(!is.na(enrldt), "Y", "N"),
 complfl = if_else(eosstt == "COMPLETED", "Y", "N", "N"),
 eotstt = if_else((eotstt == "" | is.na(eotstt))  & is.na(ineot) & saffl == "Y", "ONGOING", eotstt),
 eosstt = if_else((eosstt == "" | is.na(eosstt)) & is.na(ineos) & saffl == "Y", "ONGOING", eosstt),
 trtdurd = if_else(!is.na(trtsdt) & !is.na(trtedt), trtedt - trtsdt + 1, NA),
 trtdurd = as.numeric(trtdurd)
 )
adsl03 <- adsl03 %>%
 mutate(across(where(is.character), ~if_else(is.na(.), "", .)))

Keep only required variables;

varlist <- c("STUDYID", "USUBJID", "SUBJID", "SITEID", "AGE", "AGEU", "AGEGR1", "AGEGR1N", "SEX", "RACE", "RACE1", "RACE2", "RACESP", "SAFFL", "COMPLFL", "RANDFL", "ENRLFL", "ARM", "ACTARM", "TRT01P", "TRT01PN", "TRT01A", "TRT01AN", "TRTSDT", "TRTEDT", "TR01SDT", "TR01EDT", "EOSSTT", "EOSDT", "DCSREAS", "EOTSTT", "DCTREAS", "RFICDT", "ENRLDT", "RANDDT", "LSTALVDT", "TRTDURD", "DTHDT", "HEIGHTBL", "WEIGHTBL")

adsl <- adsl03 %>%
 rename_all(toupper) %>%
 select(all_of(varlist))

output<-adsl
output
A tibble: 8 × 40
STUDYIDUSUBJIDSUBJIDSITEIDAGEAGEUAGEGR1AGEGR1NSEXRACEEOTSTTDCTREASRFICDTENRLDTRANDDTLSTALVDTTRTDURDDTHDTHEIGHTBLWEIGHTBL
<chr><chr><chr><chr><dbl><chr><chr><dbl><chr><chr><chr><chr><date><date><date><date><dbl><date><dbl><dbl>
CSG001CSG001-100110011035YEARS< 60 Years 1MWHITE 2010-01-01NANA2010-01-01NANA NA NA
CSG001CSG001-100210021040YEARS< 60 Years 1FMULTIPLE 2010-01-012010-01-04NA2010-01-05NANA NA NA
CSG001CSG001-100310031040YEARS< 60 Years 1MOTHER 2010-01-012010-01-032010-01-032010-01-05NA2010-01-05 NA NA
CSG001CSG001-100410041038YEARS< 60 Years 1MWHITE COMPLETED 2010-01-012010-01-042010-01-052010-02-2821NA177.0087.3
CSG001CSG001-100510051064YEARS>= 60 Years2MAMERICAN INDIAN OR ALASKA NATIVE ONGOING 2010-01-152010-02-012010-02-052020-02-20 8NA 66.1476.1
CSG001CSG001-100610061075YEARS>= 60 Years2FNATIVE HAWAIIAN OR OTHER PACIFIC ISLANDERDISCONTINUEDADVERSE EVENT 2010-02-182010-03-012010-03-012010-03-25 9NA160.0060.9
CSG001CSG001-100710071032YEARS< 60 Years 1MUNKNOWN COMPLETED 2010-04-042010-04-142010-04-142010-06-1222NA178.0085.4
CSG001CSG001-100810081083YEARS>= 60 Years2FNOT REPORTED DISCONTINUEDSUBJECT REQUEST2010-06-202010-06-262010-06-272010-08-1815NA NA NA
save(adsl, file = "C:/Users/Waraba/Desktop/Ckinical Trial Training Materiels/ADaM_withR/ADaM_ADSL_withR/ADaM_ADSL_L1101/adsl.RData")
adsl
A tibble: 8 × 40
STUDYIDUSUBJIDSUBJIDSITEIDAGEAGEUAGEGR1AGEGR1NSEXRACEEOTSTTDCTREASRFICDTENRLDTRANDDTLSTALVDTTRTDURDDTHDTHEIGHTBLWEIGHTBL
<chr><chr><chr><chr><dbl><chr><chr><dbl><chr><chr><chr><chr><date><date><date><date><dbl><date><dbl><dbl>
CSG001CSG001-100110011035YEARS< 60 Years 1MWHITE 2010-01-01NANA2010-01-01NANA NA NA
CSG001CSG001-100210021040YEARS< 60 Years 1FMULTIPLE 2010-01-012010-01-04NA2010-01-05NANA NA NA
CSG001CSG001-100310031040YEARS< 60 Years 1MOTHER 2010-01-012010-01-032010-01-032010-01-05NA2010-01-05 NA NA
CSG001CSG001-100410041038YEARS< 60 Years 1MWHITE COMPLETED 2010-01-012010-01-042010-01-052010-02-2821NA177.0087.3
CSG001CSG001-100510051064YEARS>= 60 Years2MAMERICAN INDIAN OR ALASKA NATIVE ONGOING 2010-01-152010-02-012010-02-052020-02-20 8NA 66.1476.1
CSG001CSG001-100610061075YEARS>= 60 Years2FNATIVE HAWAIIAN OR OTHER PACIFIC ISLANDERDISCONTINUEDADVERSE EVENT 2010-02-182010-03-012010-03-012010-03-25 9NA160.0060.9
CSG001CSG001-100710071032YEARS< 60 Years 1MUNKNOWN COMPLETED 2010-04-042010-04-142010-04-142010-06-1222NA178.0085.4
CSG001CSG001-100810081083YEARS>= 60 Years2FNOT REPORTED DISCONTINUEDSUBJECT REQUEST2010-06-202010-06-262010-06-272010-08-1815NA NA NA
colnames(adsl)
  1. 'STUDYID'
  2. 'USUBJID'
  3. 'SUBJID'
  4. 'SITEID'
  5. 'AGE'
  6. 'AGEU'
  7. 'AGEGR1'
  8. 'AGEGR1N'
  9. 'SEX'
  10. 'RACE'
  11. 'RACE1'
  12. 'RACE2'
  13. 'RACESP'
  14. 'SAFFL'
  15. 'COMPLFL'
  16. 'RANDFL'
  17. 'ENRLFL'
  18. 'ARM'
  19. 'ACTARM'
  20. 'TRT01P'
  21. 'TRT01PN'
  22. 'TRT01A'
  23. 'TRT01AN'
  24. 'TRTSDT'
  25. 'TRTEDT'
  26. 'TR01SDT'
  27. 'TR01EDT'
  28. 'EOSSTT'
  29. 'EOSDT'
  30. 'DCSREAS'
  31. 'EOTSTT'
  32. 'DCTREAS'
  33. 'RFICDT'
  34. 'ENRLDT'
  35. 'RANDDT'
  36. 'LSTALVDT'
  37. 'TRTDURD'
  38. 'DTHDT'
  39. 'HEIGHTBL'
  40. 'WEIGHTBL'