Mini ADSL R program¶

In [ ]:
######    General Packages  
install.packages("pacman")        # p_load(dplyr, ggplot2, readr)  # installs any missing, then loads all
In [29]:
################
pacman::p_load(haven, dplyr,tidyr, purrr, glue, lubridate,stringr, EDCimport)

Upload the following SDTM datasets/exports needed to program ADAM.ADSL:

In [7]:
dm          <-   read_xpt("DM.xpt")
suppdm      <-   read_xpt("SUPPDM.xpt")
ds          <-   read_xpt("DS.xpt")
vs          <-   read_xpt("VS.xpt")

Merge DM and SUPPDM: Transponse SUPPDM data such that each QNAM becomes a variable

In [9]:
suppdmtrp <- suppdm %>%
    mutate(qnam=str_to_lower(qnam)) %>%
    group_by(studyid, usubjid) %>%
    pivot_wider(id_cols=c(studyid,usubjid),names_from = qnam, values_from = qval)
suppdmtrp
A grouped_df: 2 × 5
studyidusubjidrace1race2racesp
<chr><chr><chr><chr><chr>
STU001STU001-1002ASIANAMERICAN INDIAN OR ALASKA NATIVENA
STU001STU001-1003NA NA BRAZILIAN
In [10]:
all_dm <- left_join(dm, suppdmtrp, by = c("studyid", "usubjid"))
In [11]:
all_dm
A tibble: 8 × 26
studyiddomainusubjidsubjidrfstdtcrfendtcrfxstdtcrfxendtcrficdtcrfpendtc⋯raceethnicarmcdarmactarmcdactarmcountryrace1race2racesp
<chr><chr><chr><chr><chr><chr><chr><chr><chr><chr>⋯<chr><chr><chr><chr><chr><chr><chr><chr><chr><chr>
STU001DMSTU001-100110012010-01-01 2010-01-012010-01-01⋯WHITE HISPANIC OR LATINO SCRNFAILScreen FailureSCRNFAILScreen FailureUSANA NA NA
STU001DMSTU001-100210022010-01-012010-01-05 2010-01-012010-01-05⋯MULTIPLE NOT HISPANIC OR LATINONOTASSGNNot Assigned NOTASSGNNot Assigned USAASIANAMERICAN INDIAN OR ALASKA NATIVENA
STU001DMSTU001-100310032010-01-032010-01-05 2010-01-012010-01-05⋯OTHER HISPANIC OR LATINO PBO Placebo NOTTRT Not Treated USANA NA BRAZILIAN
STU001DMSTU001-100410042010-01-052010-02-282010-01-05T08:352010-01-25T08:452010-01-012010-02-28⋯WHITE HISPANIC OR LATINO ACTIVE Active ACTIVE Active USANA NA NA
STU001DMSTU001-100510052010-02-05 2010-02-05T08:462010-02-12T08:302010-01-152020-02-20⋯AMERICAN INDIAN OR ALASKA NATIVE NOT HISPANIC OR LATINOACTIVE Active PBO Placebo USANA NA NA
STU001DMSTU001-100610062010-03-022010-03-252010-03-02T08:302010-03-10T08:302010-02-182010-03-25⋯NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDERNOT HISPANIC OR LATINOPBO Placebo PBO Placebo USANA NA NA
STU001DMSTU001-100710072010-04-152010-06-122010-04-15T08:232010-05-06T08:122010-04-042010-06-12⋯UNKNOWN NOT HISPANIC OR LATINOPBO Placebo PBO Placebo USANA NA NA
STU001DMSTU001-100810082010-06-272010-08-182010-06-27T08:452010-07-11T09:202010-06-202010-08-18⋯NOT REPORTED NOT HISPANIC OR LATINOACTIVE Active ACTIVE Active USANA NA NA

Create variables that are directly based on input variables: trt01p trt01a trt01pn trt01an tr01sdt tr01edt rficdt lstalvdt dthdt trtsdt trtedt agegr1 agegr1n

In [14]:
trtdata <- all_dm %>%

    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))) %>%

    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) %>%

    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(trtdata, c('usubjid', 'trt01p','trt01a','trt01pn', 'trt01an','agegr1','agegr1n', 'ethnic'))
A tibble: 8 × 8
usubjidtrt01ptrt01atrt01pntrt01anagegr1agegr1nethnic
<chr><chr><chr><dbl><dbl><chr><dbl><chr>
STU001-1001 NANA< 60 Years 1HISPANIC OR LATINO
STU001-1002 NANA< 60 Years 1NOT HISPANIC OR LATINO
STU001-1003Placebo 1NA< 60 Years 1HISPANIC OR LATINO
STU001-1004Active Active 2 2< 60 Years 1HISPANIC OR LATINO
STU001-1005Active Placebo 2 1>= 60 Years2NOT HISPANIC OR LATINO
STU001-1006PlaceboPlacebo 1 1>= 60 Years2NOT HISPANIC OR LATINO
STU001-1007PlaceboPlacebo 1 1< 60 Years 1NOT HISPANIC OR LATINO
STU001-1008Active Active 2 2>= 60 Years2NOT HISPANIC OR LATINO

Process disposition data for treatment and study status enrldt randdt eotstt dctreas ineot

In [15]:
enrldate <- ds %>%
        filter(dsterm == "ENROLLED") %>%
        mutate(enrldt = as.Date(dsstdtc)) %>%
        select(studyid, usubjid, enrldt)
enrldate
A tibble: 7 × 3
studyidusubjidenrldt
<chr><chr><date>
STU001STU001-10022010-01-04
STU001STU001-10032010-01-03
STU001STU001-10042010-01-04
STU001STU001-10052010-02-01
STU001STU001-10062010-03-01
STU001STU001-10072010-04-14
STU001STU001-10082010-06-26
In [16]:
randdate <- ds %>%
    filter(dsterm == "RANDOMIZED") %>%
    mutate(randdt = as.Date(dsstdtc)) %>%
    select(studyid, usubjid, randdt)

randdate
A tibble: 6 × 3
studyidusubjidranddt
<chr><chr><date>
STU001STU001-10032010-01-03
STU001STU001-10042010-01-05
STU001STU001-10052010-02-05
STU001STU001-10062010-03-01
STU001STU001-10072010-04-14
STU001STU001-10082010-06-27
In [17]:
eotdata <- 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)

eotdata
A tibble: 4 × 5
studyidusubjideotsttdctreasineot
<chr><chr><chr><chr><dbl>
STU001STU001-1004COMPLETED NA 1
STU001STU001-1006DISCONTINUEDADVERSE EVENT 1
STU001STU001-1007COMPLETED NA 1
STU001STU001-1008DISCONTINUEDSUBJECT REQUEST1
In [18]:
eosdata <- 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)
 eosdata
A tibble: 6 × 6
studyidusubjideossttdcsreaseosdtineos
<chr><chr><chr><chr><date><dbl>
STU001STU001-1002DISCONTINUEDWITHDRAWL OF CONSENT2010-01-051
STU001STU001-1003DISCONTINUEDDEATH 2010-01-051
STU001STU001-1004COMPLETED NA 2010-02-281
STU001STU001-1006DISCONTINUEDADVERSE EVENT 2010-03-251
STU001STU001-1007COMPLETED NA 2010-06-121
STU001STU001-1008DISCONTINUEDSUBJECT REQUEST 2010-08-181

Baseline variables from vital signs; heightbl weightbl

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

weightbl <- vs %>%
     filter(vsblfl == "Y" & vstestcd == "WEIGHT") %>%
     select(studyid, usubjid, vsstresn) %>%
     rename(weightbl = vsstresn)
weightbl
A tibble: 4 × 3
studyidusubjidheightbl
<chr><chr><dbl>
STU001STU001-1004177.00
STU001STU001-1005 66.14
STU001STU001-1006160.00
STU001STU001-1007178.00
A tibble: 4 × 3
studyidusubjidweightbl
<chr><chr><dbl>
STU001STU001-100487.3
STU001STU001-100576.1
STU001STU001-100660.9
STU001STU001-100785.4

Merge all the information in created dataset

In [20]:
all_dframes <- list(trtdata, enrldate, randdate, eotdata, eosdata, heightbl, weightbl)
all_dframes
  1. A tibble: 8 × 39
    studyiddomainusubjidsubjidrfstdtcrfendtcrfxstdtcrfxendtcrficdtcrfpendtc⋯trt01antr01sdttr01edtrficdtlstalvdtdthdttrtsdttrtedtagegr1agegr1n
    <chr><chr><chr><chr><chr><chr><chr><chr><chr><chr>⋯<dbl><date><date><date><date><date><date><date><chr><dbl>
    STU001DMSTU001-100110012010-01-01 2010-01-012010-01-01⋯NANANA2010-01-012010-01-01NANANA< 60 Years 1
    STU001DMSTU001-100210022010-01-012010-01-05 2010-01-012010-01-05⋯NANANA2010-01-012010-01-05NANANA< 60 Years 1
    STU001DMSTU001-100310032010-01-032010-01-05 2010-01-012010-01-05⋯NANANA2010-01-012010-01-052010-01-05NANA< 60 Years 1
    STU001DMSTU001-100410042010-01-052010-02-282010-01-05T08:352010-01-25T08:452010-01-012010-02-28⋯ 22010-01-052010-01-252010-01-012010-02-28NA2010-01-052010-01-25< 60 Years 1
    STU001DMSTU001-100510052010-02-05 2010-02-05T08:462010-02-12T08:302010-01-152020-02-20⋯ 12010-02-052010-02-122010-01-152020-02-20NA2010-02-052010-02-12>= 60 Years2
    STU001DMSTU001-100610062010-03-022010-03-252010-03-02T08:302010-03-10T08:302010-02-182010-03-25⋯ 12010-03-022010-03-102010-02-182010-03-25NA2010-03-022010-03-10>= 60 Years2
    STU001DMSTU001-100710072010-04-152010-06-122010-04-15T08:232010-05-06T08:122010-04-042010-06-12⋯ 12010-04-152010-05-062010-04-042010-06-12NA2010-04-152010-05-06< 60 Years 1
    STU001DMSTU001-100810082010-06-272010-08-182010-06-27T08:452010-07-11T09:202010-06-202010-08-18⋯ 22010-06-272010-07-112010-06-202010-08-18NA2010-06-272010-07-11>= 60 Years2
  2. A tibble: 7 × 3
    studyidusubjidenrldt
    <chr><chr><date>
    STU001STU001-10022010-01-04
    STU001STU001-10032010-01-03
    STU001STU001-10042010-01-04
    STU001STU001-10052010-02-01
    STU001STU001-10062010-03-01
    STU001STU001-10072010-04-14
    STU001STU001-10082010-06-26
  3. A tibble: 6 × 3
    studyidusubjidranddt
    <chr><chr><date>
    STU001STU001-10032010-01-03
    STU001STU001-10042010-01-05
    STU001STU001-10052010-02-05
    STU001STU001-10062010-03-01
    STU001STU001-10072010-04-14
    STU001STU001-10082010-06-27
  4. A tibble: 4 × 5
    studyidusubjideotsttdctreasineot
    <chr><chr><chr><chr><dbl>
    STU001STU001-1004COMPLETED NA 1
    STU001STU001-1006DISCONTINUEDADVERSE EVENT 1
    STU001STU001-1007COMPLETED NA 1
    STU001STU001-1008DISCONTINUEDSUBJECT REQUEST1
  5. A tibble: 6 × 6
    studyidusubjideossttdcsreaseosdtineos
    <chr><chr><chr><chr><date><dbl>
    STU001STU001-1002DISCONTINUEDWITHDRAWL OF CONSENT2010-01-051
    STU001STU001-1003DISCONTINUEDDEATH 2010-01-051
    STU001STU001-1004COMPLETED NA 2010-02-281
    STU001STU001-1006DISCONTINUEDADVERSE EVENT 2010-03-251
    STU001STU001-1007COMPLETED NA 2010-06-121
    STU001STU001-1008DISCONTINUEDSUBJECT REQUEST 2010-08-181
  6. A tibble: 4 × 3
    studyidusubjidheightbl
    <chr><chr><dbl>
    STU001STU001-1004177.00
    STU001STU001-1005 66.14
    STU001STU001-1006160.00
    STU001STU001-1007178.00
  7. A tibble: 4 × 3
    studyidusubjidweightbl
    <chr><chr><dbl>
    STU001STU001-100487.3
    STU001STU001-100576.1
    STU001STU001-100660.9
    STU001STU001-100785.4
In [21]:
adsltemp1 <- reduce(all_dframes, left_join, by = c("studyid", "usubjid"))
adsltemp1
A tibble: 8 × 50
studyiddomainusubjidsubjidrfstdtcrfendtcrfxstdtcrfxendtcrficdtcrfpendtc⋯randdteotsttdctreasineoteossttdcsreaseosdtineosheightblweightbl
<chr><chr><chr><chr><chr><chr><chr><chr><chr><chr>⋯<date><chr><chr><dbl><chr><chr><date><dbl><dbl><dbl>
STU001DMSTU001-100110012010-01-01 2010-01-012010-01-01⋯NANA NA NANA NA NANA NA NA
STU001DMSTU001-100210022010-01-012010-01-05 2010-01-012010-01-05⋯NANA NA NADISCONTINUEDWITHDRAWL OF CONSENT2010-01-05 1 NA NA
STU001DMSTU001-100310032010-01-032010-01-05 2010-01-012010-01-05⋯2010-01-03NA NA NADISCONTINUEDDEATH 2010-01-05 1 NA NA
STU001DMSTU001-100410042010-01-052010-02-282010-01-05T08:352010-01-25T08:452010-01-012010-02-28⋯2010-01-05COMPLETED NA 1COMPLETED NA 2010-02-28 1177.0087.3
STU001DMSTU001-100510052010-02-05 2010-02-05T08:462010-02-12T08:302010-01-152020-02-20⋯2010-02-05NA NA NANA NA NANA 66.1476.1
STU001DMSTU001-100610062010-03-022010-03-252010-03-02T08:302010-03-10T08:302010-02-182010-03-25⋯2010-03-01DISCONTINUEDADVERSE EVENT 1DISCONTINUEDADVERSE EVENT 2010-03-25 1160.0060.9
STU001DMSTU001-100710072010-04-152010-06-122010-04-15T08:232010-05-06T08:122010-04-042010-06-12⋯2010-04-14COMPLETED NA 1COMPLETED NA 2010-06-12 1178.0085.4
STU001DMSTU001-100810082010-06-272010-08-182010-06-27T08:452010-07-11T09:202010-06-202010-08-18⋯2010-06-27DISCONTINUEDSUBJECT REQUEST 1DISCONTINUEDSUBJECT REQUEST 2010-08-18 1 NA NA

Create variables/assign values to existing variables which are dependent on their variables; saffl randfl enrlfl complfl eotstt eosstt trtdurd

In [22]:
adsltemp2 <- adsltemp1 %>%
     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"),
         
         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)
 )

adsltemp2
A tibble: 8 × 55
studyiddomainusubjidsubjidrfstdtcrfendtcrfxstdtcrfxendtcrficdtcrfpendtc⋯dcsreaseosdtineosheightblweightblsafflrandflenrlflcomplfltrtdurd
<chr><chr><chr><chr><chr><chr><chr><chr><chr><chr>⋯<chr><date><dbl><dbl><dbl><chr><chr><chr><chr><dbl>
STU001DMSTU001-100110012010-01-01 2010-01-012010-01-01⋯NA NANA NA NANNNNANA
STU001DMSTU001-100210022010-01-012010-01-05 2010-01-012010-01-05⋯WITHDRAWL OF CONSENT2010-01-05 1 NA NANNYN NA
STU001DMSTU001-100310032010-01-032010-01-05 2010-01-012010-01-05⋯DEATH 2010-01-05 1 NA NANYYN NA
STU001DMSTU001-100410042010-01-052010-02-282010-01-05T08:352010-01-25T08:452010-01-012010-02-28⋯NA 2010-02-28 1177.0087.3YYYY 21
STU001DMSTU001-100510052010-02-05 2010-02-05T08:462010-02-12T08:302010-01-152020-02-20⋯NA NANA 66.1476.1YYYNA 8
STU001DMSTU001-100610062010-03-022010-03-252010-03-02T08:302010-03-10T08:302010-02-182010-03-25⋯ADVERSE EVENT 2010-03-25 1160.0060.9YYYN 9
STU001DMSTU001-100710072010-04-152010-06-122010-04-15T08:232010-05-06T08:122010-04-042010-06-12⋯NA 2010-06-12 1178.0085.4YYYY 22
STU001DMSTU001-100810082010-06-272010-08-182010-06-27T08:452010-07-11T09:202010-06-202010-08-18⋯SUBJECT REQUEST 2010-08-18 1 NA NAYYYN 15

Replace NA with missing

In [23]:
adsltemp3 <- adsltemp2 %>%
     mutate(across(where(is.character), ~if_else(is.na(.), "", .)))

adsltemp3
A tibble: 8 × 55
studyiddomainusubjidsubjidrfstdtcrfendtcrfxstdtcrfxendtcrficdtcrfpendtc⋯dcsreaseosdtineosheightblweightblsafflrandflenrlflcomplfltrtdurd
<chr><chr><chr><chr><chr><chr><chr><chr><chr><chr>⋯<chr><date><dbl><dbl><dbl><chr><chr><chr><chr><dbl>
STU001DMSTU001-100110012010-01-01 2010-01-012010-01-01⋯ NANA NA NANNN NA
STU001DMSTU001-100210022010-01-012010-01-05 2010-01-012010-01-05⋯WITHDRAWL OF CONSENT2010-01-05 1 NA NANNYNNA
STU001DMSTU001-100310032010-01-032010-01-05 2010-01-012010-01-05⋯DEATH 2010-01-05 1 NA NANYYNNA
STU001DMSTU001-100410042010-01-052010-02-282010-01-05T08:352010-01-25T08:452010-01-012010-02-28⋯ 2010-02-28 1177.0087.3YYYY21
STU001DMSTU001-100510052010-02-05 2010-02-05T08:462010-02-12T08:302010-01-152020-02-20⋯ NANA 66.1476.1YYY 8
STU001DMSTU001-100610062010-03-022010-03-252010-03-02T08:302010-03-10T08:302010-02-182010-03-25⋯ADVERSE EVENT 2010-03-25 1160.0060.9YYYN 9
STU001DMSTU001-100710072010-04-152010-06-122010-04-15T08:232010-05-06T08:122010-04-042010-06-12⋯ 2010-06-12 1178.0085.4YYYY22
STU001DMSTU001-100810082010-06-272010-08-182010-06-27T08:452010-07-11T09:202010-06-202010-08-18⋯SUBJECT REQUEST 2010-08-18 1 NA NAYYYN15
In [ ]:

In [24]:
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 <- adsltemp3 %>%
 rename_all(toupper) %>%
 select(all_of(varlist))
 
adsl
A tibble: 8 × 40
STUDYIDUSUBJIDSUBJIDSITEIDAGEAGEUAGEGR1AGEGR1NSEXRACE⋯EOTSTTDCTREASRFICDTENRLDTRANDDTLSTALVDTTRTDURDDTHDTHEIGHTBLWEIGHTBL
<chr><chr><chr><chr><dbl><chr><chr><dbl><chr><chr>⋯<chr><chr><date><date><date><date><dbl><date><dbl><dbl>
STU001STU001-100110011035YEARS< 60 Years 1MWHITE ⋯ 2010-01-01NANA2010-01-01NANA NA NA
STU001STU001-100210021040YEARS< 60 Years 1FMULTIPLE ⋯ 2010-01-012010-01-04NA2010-01-05NANA NA NA
STU001STU001-100310031040YEARS< 60 Years 1MOTHER ⋯ 2010-01-012010-01-032010-01-032010-01-05NA2010-01-05 NA NA
STU001STU001-100410041038YEARS< 60 Years 1MWHITE ⋯COMPLETED 2010-01-012010-01-042010-01-052010-02-2821NA177.0087.3
STU001STU001-100510051064YEARS>= 60 Years2MAMERICAN INDIAN OR ALASKA NATIVE ⋯ONGOING 2010-01-152010-02-012010-02-052020-02-20 8NA 66.1476.1
STU001STU001-100610061075YEARS>= 60 Years2FNATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER⋯DISCONTINUEDADVERSE EVENT 2010-02-182010-03-012010-03-012010-03-25 9NA160.0060.9
STU001STU001-100710071032YEARS< 60 Years 1MUNKNOWN ⋯COMPLETED 2010-04-042010-04-142010-04-142010-06-1222NA178.0085.4
STU001STU001-100810081083YEARS>= 60 Years2FNOT REPORTED ⋯DISCONTINUEDSUBJECT REQUEST2010-06-202010-06-262010-06-272010-08-1815NA NA NA
In [27]:
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'
In [28]:
write_xpt(adsl, "adsl.xpt")
In [ ]: