TLG Catalog - Stable
  • Stable
    • Dev
  1. Tables
  2. Disclosures
  3. DISCLOSUREST01
  • Introduction

  • Tables
    • ADA
      • ADAT01
      • ADAT02
      • ADAT03
      • ADAT04A
      • ADAT04B
    • Adverse Events
      • AET01
      • AET01_AESI
      • AET02
      • AET02_SMQ
      • AET03
      • AET04
      • AET04_PI
      • AET05
      • AET05_ALL
      • AET06
      • AET06_SMQ
      • AET07
      • AET09
      • AET09_SMQ
      • AET10
    • Concomitant Medications
      • CMT01
      • CMT01A
      • CMT01B
      • CMT02_PT
    • Deaths
      • DTHT01
    • Demography
      • DMT01
    • Disclosures
      • DISCLOSUREST01
      • EUDRAT01
      • EUDRAT02
    • Disposition
      • DST01
      • PDT01
      • PDT02
    • ECG
      • EGT01
      • EGT02
      • EGT03
      • EGT04
      • EGT05_QTCAT
    • Efficacy
      • AOVT01
      • AOVT02
      • AOVT03
      • CFBT01
      • CMHT01
      • COXT01
      • COXT02
      • DORT01
      • LGRT02
      • MMRMT01
      • ONCT05
      • RATET01
      • RBMIT01
      • RSPT01
      • TTET01
    • Exposure
      • EXT01
    • Lab Results
      • LBT01
      • LBT02
      • LBT03
      • LBT04
      • LBT05
      • LBT06
      • LBT07
      • LBT08
      • LBT09
      • LBT10
      • LBT10_BL
      • LBT11
      • LBT11_BL
      • LBT12
      • LBT12_BL
      • LBT13
      • LBT14
      • LBT15
    • Medical History
      • MHT01
    • Pharmacokinetic
      • PKCT01
      • PKPT02
      • PKPT03
      • PKPT04
      • PKPT05
      • PKPT06
      • PKPT07
      • PKPT08
      • PKPT11
    • Risk Management Plan
      • RMPT01
      • RMPT03
      • RMPT04
      • RMPT05
      • RMPT06
    • Safety
      • ENTXX
    • Vital Signs
      • VST01
      • VST02
  • Listings
    • ADA
      • ADAL02
    • Adverse Events
      • AEL01
      • AEL01_NOLLT
      • AEL02
      • AEL02_ED
      • AEL03
      • AEL04
    • Concomitant Medications
      • CML01
      • CML02A_GL
      • CML02B_GL
    • Development Safety Update Report
      • DSUR4
    • Disposition
      • DSL01
      • DSL02
    • ECG
      • EGL01
    • Efficacy
      • ONCL01
    • Exposure
      • EXL01
    • Lab Results
      • LBL01
      • LBL01_RLS
      • LBL02A
      • LBL02A_RLS
      • LBL02B
    • Medical History
      • MHL01
    • Pharmacokinetic
      • ADAL01
      • PKCL01
      • PKCL02
      • PKPL01
      • PKPL02
      • PKPL04
    • Vital Signs
      • VSL01
  • Graphs
    • Efficacy
      • FSTG01
      • FSTG02
      • KMG01
      • MMRMG01
      • MMRMG02
    • Other
      • BRG01
      • BWG01
      • CIG01
      • IPPG01
      • LTG01
      • MNG01
    • Pharmacokinetic
      • PKCG01
      • PKCG02
      • PKCG03
      • PKPG01
      • PKPG02
      • PKPG03
      • PKPG04
      • PKPG06

  • Appendix
    • Reproducibility

  • Index

On this page

  • Reproducibility
    • Timestamp
    • Session Info
    • .lock file
  • Edit this page
  • Report an issue
  1. Tables
  2. Disclosures
  3. DISCLOSUREST01

DISCLOSUREST01

Disclosures Outputs


  • Patient Disposition Table
    (CTgov & EudraCT)
  • Demographic Table
    (CTgov & EudraCT)
  • Enrollment by Country
    Table (EudraCT only)
  • Non-Serious Adverse Events
    Reported in \(\geq\) 5% of Patients in Any
    Treatment Group (CTgov & EudraCT)
  • Serious Adverse Events, Fatal SAEs
    and SAEs Related to Study Medication,
    by Treatment Group (CTgov & EudraCT)
  • Death Table
    (EudraCT only)

Data Setup

Code
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)

set.seed(1, kind = "Mersenne-Twister")

# Add additional disposition variables to adsl.
adsl0 <- adsl %>%
  mutate(
    STSTFL = case_when(
      is.na(RANDDT) ~ "N",
      TRUE ~ "Y"
    ) %>% as.factor(),
    COMPSTUD = sample(
      c("Y", "N"),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    STUDONS = sample(
      c("Alive: On Treatment", "Alive: In Follow-up", NA),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    STDDRS = sample(
      c(
        "Death", "Lost To Follow-Up",
        "Protocol Violation", "Withdrawal By Subject",
        "Other"
      ),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    GOTTRT = ifelse(!is.na(ACTARMCD), "Y", "N") %>%
      as.factor(),
    DISTRTFL = sample(
      c("Y", "N"),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    TRTDRS = sample(
      c(
        "ADVERSE EVENT", "PROGRESSIVE DISEASE",
        "PHYSICIAN DECISION", "LACK OF EFFICACY",
        "OTHER"
      ),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    STUDONS = case_when(COMPSTUD == "N" ~ STUDONS),
    STDDRS = case_when(COMPSTUD == "N" & is.na(STUDONS) ~ STDDRS),
    DISSTDFL = case_when(!is.na(STDDRS) ~ "Y"),
    DISTRTFL = case_when(GOTTRT == "Y" ~ DISTRTFL),
    TRTDRS = case_when(DISTRTFL == "Y" ~ TRTDRS),
    DRSCAT = case_when(
      TRTDRS %in% c("ADVERSE EVENT", "PHYSICIAN DECISION") ~ "Safety",
      !is.na(TRTDRS) ~ "Other"
    )
  ) %>%
  var_relabel(
    STSTFL = "Started Study",
    COMPSTUD = "Complete Study",
    STUDONS = "On-study Status",
    DISSTDFL = "Discontinued Study",
    STDDRS = "Reason for Study Discontinuation",
    GOTTRT = "Received Treatment",
    DISTRTFL = "Discontinued Treatment",
    TRTDRS = "Reason for Treatment Discontinuation",
    DRSCAT = "Subcategory for Treatment Discontinuation"
  )

Patient Disposition Table

  • Preview
  • Try this using WebR
Code
# Define the split function
split_fun <- keep_split_levels("Y")

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(
    "ARM",
    split_fun = add_overall_level("All Patients", first = FALSE)
  ) %>%
  count_values("STSTFL",
    values = "Y",
    .labels = c(count_fraction = "Started Study")
  ) %>%
  count_values("COMPSTUD",
    values = "Y",
    .labels = c(count_fraction = "Completed Study")
  ) %>%
  split_rows_by(
    "DISSTDFL",
    split_fun = split_fun
  ) %>%
  summarize_row_groups(label_fstr = "Discontinued Study") %>%
  analyze_vars(
    "STDDRS",
    .stats = "count_fraction"
  ) %>%
  append_topleft("Status")

result <- build_table(lyt = lyt, df = adsl0)
result
                            A: Drug X      B: Placebo     C: Combination   All Patients 
Status                       (N=134)         (N=134)         (N=132)          (N=400)   
————————————————————————————————————————————————————————————————————————————————————————
Started Study             134 (100.00%)   134 (100.00%)   132 (100.00%)    400 (100.00%)
Completed Study            65 (48.51%)     67 (50.00%)     69 (52.27%)     201 (50.25%) 
Discontinued Study         15 (11.2%)      28 (20.9%)       24 (18.2%)      67 (16.8%)  
  Death                      6 (40%)        5 (17.9%)       4 (16.7%)       15 (22.4%)  
  Lost To Follow-Up         1 (6.7%)        3 (10.7%)       8 (33.3%)       12 (17.9%)  
  Other                     2 (13.3%)       6 (21.4%)       5 (20.8%)       13 (19.4%)  
  Protocol Violation        4 (26.7%)       4 (14.3%)       4 (16.7%)       12 (17.9%)  
  Withdrawal By Subject     2 (13.3%)      10 (35.7%)       3 (12.5%)       15 (22.4%)  
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

Data Setup

Code
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)

# Change description in variable SEX.
adsl <- adsl %>%
  mutate(
    SEX = factor(case_when(
      SEX == "M" ~ "Male",
      SEX == "F" ~ "Female",
      SEX == "U" ~ "Unknown",
      SEX == "UNDIFFERENTIATED" ~ "Undifferentiated"
    )),
    AGEGRP = factor(
      case_when(
        between(AGE, 18, 40) ~ "18-40",
        between(AGE, 41, 64) ~ "41-64",
        AGE > 64 ~ ">=65"
      ),
      levels = c("18-40", "41-64", ">=65")
    )
  )

Demographic Table

  • Preview
  • Try this using WebR
Code
vars <- c("AGE", "AGEGRP", "SEX", "RACE", "ETHNIC")
var_labels <- c("Age (yr)", "Age group", "Sex", "Race", "Ethnicity")

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM") %>%
  add_overall_col("All Patients") %>%
  analyze_vars(
    vars = vars,
    var_labels = var_labels
  )

result <- build_table(lyt = lyt, df = adsl)
result
                                               A: Drug X    B: Placebo    C: Combination   All Patients
                                                (N=134)       (N=134)        (N=132)         (N=400)   
———————————————————————————————————————————————————————————————————————————————————————————————————————
Age (yr)                                                                                               
  n                                               134           134            132             400     
  Mean (SD)                                   33.8 (6.6)    35.4 (7.9)      35.4 (7.7)      34.9 (7.4) 
  Median                                         33.0          35.0            35.0            34.0    
  Min - Max                                   21.0 - 50.0   21.0 - 62.0    20.0 - 69.0     20.0 - 69.0 
Age group                                                                                              
  n                                               134           134            132             400     
  18-40                                       113 (84.3%)   103 (76.9%)    106 (80.3%)     322 (80.5%) 
  41-64                                       21 (15.7%)    31 (23.1%)      25 (18.9%)      77 (19.2%) 
  >=65                                             0             0           1 (0.8%)        1 (0.2%)  
Sex                                                                                                    
  n                                               134           134            132             400     
  Female                                       79 (59%)     82 (61.2%)       70 (53%)      231 (57.8%) 
  Male                                         55 (41%)     52 (38.8%)       62 (47%)      169 (42.2%) 
Race                                                                                                   
  n                                               134           134            132             400     
  ASIAN                                       68 (50.7%)     67 (50%)       73 (55.3%)      208 (52%)  
  BLACK OR AFRICAN AMERICAN                   31 (23.1%)    28 (20.9%)      32 (24.2%)      91 (22.8%) 
  WHITE                                       27 (20.1%)    26 (19.4%)      21 (15.9%)      74 (18.5%) 
  AMERICAN INDIAN OR ALASKA NATIVE              8 (6%)       11 (8.2%)       6 (4.5%)       25 (6.2%)  
  MULTIPLE                                         0         1 (0.7%)           0            1 (0.2%)  
  NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER        0         1 (0.7%)           0            1 (0.2%)  
  OTHER                                            0             0              0               0      
  UNKNOWN                                          0             0              0               0      
Ethnicity                                                                                              
  n                                               134           134            132             400     
  HISPANIC OR LATINO                          15 (11.2%)    18 (13.4%)      15 (11.4%)       48 (12%)  
  NOT HISPANIC OR LATINO                      104 (77.6%)   103 (76.9%)    101 (76.5%)      308 (77%)  
  NOT REPORTED                                 6 (4.5%)      10 (7.5%)      11 (8.3%)       27 (6.8%)  
  UNKNOWN                                      9 (6.7%)      3 (2.2%)        5 (3.8%)       17 (4.2%)  
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

Data Setup

Code
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl
adsl_labels <- var_labels(adsl)

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)

adsl <- adsl %>%
  mutate(COUNTRY = droplevels(COUNTRY)) %>%
  arrange(REGION1, COUNTRY)

var_labels(adsl) <- c(adsl_labels)

Enrollment by Country Table

  • Preview
  • Try this using WebR
Code
lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ARM") %>%
  add_overall_col(label = "All Patients") %>%
  analyze_vars("COUNTRY") %>%
  append_varlabels(adsl, "COUNTRY")

result <- build_table(lyt, adsl)
result
          A: Drug X    B: Placebo   C: Combination   All Patients
Country    (N=134)      (N=134)        (N=132)         (N=400)   
—————————————————————————————————————————————————————————————————
n            134          134            132             400     
CHN       74 (55.2%)   81 (60.4%)     64 (48.5%)     219 (54.8%) 
USA       10 (7.5%)    13 (9.7%)      17 (12.9%)       40 (10%)  
BRA       13 (9.7%)     7 (5.2%)      10 (7.6%)       30 (7.5%)  
PAK        12 (9%)      9 (6.7%)      10 (7.6%)       31 (7.8%)  
NGA         8 (6%)      7 (5.2%)      11 (8.3%)       26 (6.5%)  
RUS        5 (3.7%)      8 (6%)        6 (4.5%)       19 (4.8%)  
JPN        5 (3.7%)      4 (3%)        9 (6.8%)       18 (4.5%)  
GBR         4 (3%)      3 (2.2%)       2 (1.5%)        9 (2.2%)  
CAN        3 (2.2%)     2 (1.5%)       3 (2.3%)         8 (2%)   
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

Data Setup

Trimming function get_adae_trimmed is defined to filter AEs with greater than 5% incidence rate.

Code
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl
adae <- random.cdisc.data::cadae

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)
adae <- df_explicit_na(adae)

adae_nonser <- adae %>% filter(AESER != "Y", SAFFL == "Y")

get_adae_trimmed <- function(adsl, adae, cutoff_rate) {
  n_per_arm <- adsl %>%
    dplyr::count(ARM)

  anl_terms <- adae %>%
    dplyr::group_by(ARM, AEBODSYS, AEDECOD) %>%
    dplyr::count(
      unique_terms = n_distinct(USUBJID)
    ) %>%
    dplyr::select(-n) %>%
    dplyr::ungroup()

  anl_terms <- dplyr::left_join(
    anl_terms,
    n_per_arm,
    by = "ARM"
  ) %>%
    dplyr::mutate(
      ae_rate = unique_terms / n
    ) %>%
    dplyr::filter(ae_rate >= cutoff_rate) %>%
    dplyr::select(AEDECOD) %>%
    unique()

  anl <- dplyr::left_join(
    anl_terms,
    adae,
    by = "AEDECOD"
  )
  anl
}

adae_trim <- get_adae_trimmed(adsl, adae_nonser, cutoff_rate = 0.05)

Non-Serious Adverse Events Report in \(\geq\) 5% of Patients in Any Treatment Group

  • Preview
  • Try this using WebR
Code
# Define the split function
split_fun <- drop_split_levels

lyt <- basic_table() %>%
  split_cols_by("ARM") %>%
  summarize_patients_events_in_cols(
    custom_label = "Total number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5%" 
  ) %>%
  split_rows_by("AEBODSYS",
    nested = FALSE,
    split_fun = split_fun,
    indent_mod = -1L,
    label_pos = "topleft",
    split_label = obj_label(adae_trim$AEBODSYS)
  ) %>%
  split_rows_by("AEDECOD", split_fun = split_fun, label_pos = "topleft", split_label = obj_label(adae_trim$AEDECOD)) %>%
  summarize_patients_events_in_cols(
    col_split = FALSE
  )

result <- build_table(lyt, adae_trim)
result
Body System or Organ Class                                                                                                A: Drug X                      B: Placebo                    C: Combination        
  Dictionary-Derived Term                                                                                       Patients (All)   Events (All)   Patients (All)   Events (All)   Patients (All)   Events (All)
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
Total number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5%        106             360             112             367             112             421     
cl A.1                                                                                                                                                                                                       
  dcd A.1.1.1.1                                                                                                       50              64              45              62              63              88     
cl B.2                                                                                                                                                                                                       
  dcd B.2.1.2.1                                                                                                       49              65              44              62              52              66     
cl C.1                                                                                                                                                                                                       
  dcd C.1.1.1.3                                                                                                       43              55              46              63              43              64     
cl C.2                                                                                                                                                                                                       
  dcd C.2.1.2.1                                                                                                       35              48              48              53              55              65     
cl D.1                                                                                                                                                                                                       
  dcd D.1.1.4.2                                                                                                       48              66              42              55              50              64     
cl D.2                                                                                                                                                                                                       
  dcd D.2.1.5.3                                                                                                       47              62              58              72              57              74     
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

For illustrative purposes, the adae data is filtered by arm “A: Drug X” here.

Data Setup

Code
library(tern)
library(dplyr)

adae <- random.cdisc.data::cadae

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adae <- df_explicit_na(adae)

adae_serious <- adae %>% filter(AESER == "Y", SAFFL == "Y")
adae_serious_arm <- adae_serious %>% filter(ARM == "A: Drug X")

filters_list <- list(
  related = with_label(c(AEREL = "Y"), "Events (Related)"),
  fatal = with_label(c(AESDTH = "Y"), "Events (Fatal)"),
  fatal_related = with_label(c(AEREL = "Y", AESDTH = "Y"), "Events (Fatal & Related)")
)

Serious Adverse Events, Fatal SAEs and SAEs Related to Study Medication, by Treatment Group

  • Preview
  • Try this using WebR
Code
# Define the split function
split_fun <- drop_split_levels

lyt <- basic_table() %>%
  summarize_patients_events_in_cols(
    filters_list = filters_list,
    empty_stats = c("all", "related", "fatal", "fatal_related"),
    custom_label = "Total number of patients with at least one serious adverse event"
  ) %>%
  split_rows_by("AEBODSYS",
    nested = FALSE,
    split_fun = split_fun,
    indent_mod = -1L,
    label_pos = "topleft",
    split_label = obj_label(adae_trim$AEBODSYS)
  ) %>%
  split_rows_by("AEDECOD",
    split_fun = split_fun,
    label_pos = "topleft",
    split_label = obj_label(adae_serious_arm$AEDECOD)
  ) %>%
  summarize_patients_events_in_cols(
    filters_list = filters_list,
    col_split = FALSE
  )

result <- build_table(lyt, adae_serious_arm)
result
Body System or Organ Class                                                                                                                                     
  Dictionary-Derived Term                                          Patients (All)   Events (All)   Events (Related)   Events (Fatal)   Events (Fatal & Related)
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
Total number of patients with at least one serious adverse event        104                                                                                    
cl A.1                                                                                                                                                         
  dcd A.1.1.1.2                                                          48              68               0                 0                     0            
cl B.1                                                                                                                                                         
  dcd B.1.1.1.1                                                          47              56               56                56                    56           
cl B.2                                                                                                                                                         
  dcd B.2.2.3.1                                                          48              64               0                 0                     0            
cl D.1                                                                                                                                                         
  dcd D.1.1.1.1                                                          50              61               61                61                    61           
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

Data Setup

Code
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl
adae <- random.cdisc.data::cadae

Death Table

  • Preview
  • Try this using WebR
Code
lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ARM") %>%
  add_overall_col("All Patients") %>%
  count_patients_with_event(
    "USUBJID",
    filters = c("AESDTH" = "Y"),
    .labels = c(count_fraction = "Total Number of Deaths"),
    .formats = c(count_fraction = "xx (xx.xx%)")
  )
result <- build_table(lyt, adae, alt_counts_df = adsl)
result
                          A: Drug X    B: Placebo    C: Combination   All Patients
                           (N=134)       (N=134)        (N=132)         (N=400)   
——————————————————————————————————————————————————————————————————————————————————
Total Number of Deaths   76 (62.30%)   70 (56.91%)    75 (62.50%)     221 (60.55%)
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

Reproducibility

Timestamp

[1] "2025-07-09 17:39:23 UTC"

Session Info

─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.5.0 (2025-04-11)
 os       Ubuntu 24.04.2 LTS
 system   x86_64, linux-gnu
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       Etc/UTC
 date     2025-07-09
 pandoc   3.7.0.2 @ /usr/bin/ (via rmarkdown)
 quarto   1.7.32 @ /usr/local/bin/quarto

─ Packages ───────────────────────────────────────────────────────────────────
 package           * version date (UTC) lib source
 backports           1.5.0   2024-05-23 [1] RSPM
 brio                1.1.5   2024-04-24 [1] RSPM
 broom               1.0.8   2025-03-28 [1] RSPM
 checkmate           2.3.2   2024-07-29 [1] RSPM
 cli                 3.6.5   2025-04-23 [1] RSPM
 codetools           0.2-20  2024-03-31 [2] CRAN (R 4.5.0)
 curl                6.4.0   2025-06-22 [1] RSPM
 dichromat           2.0-0.1 2022-05-02 [1] CRAN (R 4.5.0)
 digest              0.6.37  2024-08-19 [1] RSPM
 dplyr             * 1.1.4   2023-11-17 [1] RSPM
 evaluate            1.0.4   2025-06-18 [1] RSPM
 farver              2.1.2   2024-05-13 [1] RSPM
 fastmap             1.2.0   2024-05-15 [1] RSPM
 forcats             1.0.0   2023-01-29 [1] RSPM
 formatters        * 0.5.11  2025-04-09 [1] RSPM
 generics            0.1.4   2025-05-09 [1] RSPM
 ggplot2             3.5.2   2025-04-09 [1] RSPM
 glue                1.8.0   2024-09-30 [1] RSPM
 gtable              0.3.6   2024-10-25 [1] RSPM
 htmltools           0.5.8.1 2024-04-04 [1] RSPM
 htmlwidgets         1.6.4   2023-12-06 [1] RSPM
 jsonlite            2.0.0   2025-03-27 [1] RSPM
 knitr               1.50    2025-03-16 [1] RSPM
 lattice             0.22-7  2025-04-02 [2] CRAN (R 4.5.0)
 lifecycle           1.0.4   2023-11-07 [1] RSPM
 magrittr          * 2.0.3   2022-03-30 [1] RSPM
 Matrix              1.7-3   2025-03-11 [1] CRAN (R 4.5.0)
 nestcolor           0.1.3   2025-01-21 [1] RSPM
 pillar              1.11.0  2025-07-04 [1] RSPM
 pkgcache            2.2.4   2025-05-26 [1] RSPM
 pkgconfig           2.0.3   2019-09-22 [1] RSPM
 processx            3.8.6   2025-02-21 [1] RSPM
 ps                  1.9.1   2025-04-12 [1] RSPM
 purrr               1.0.4   2025-02-05 [1] RSPM
 R6                  2.6.1   2025-02-15 [1] RSPM
 random.cdisc.data   0.3.16  2024-10-10 [1] RSPM
 rbibutils           2.3     2024-10-04 [1] RSPM
 RColorBrewer        1.1-3   2022-04-03 [1] RSPM
 Rdpack              2.6.4   2025-04-09 [1] RSPM
 rlang               1.1.6   2025-04-11 [1] RSPM
 rmarkdown           2.29    2024-11-04 [1] RSPM
 rtables           * 0.6.13  2025-06-19 [1] RSPM
 scales              1.4.0   2025-04-24 [1] RSPM
 sessioninfo         1.2.3   2025-02-05 [1] any (@1.2.3)
 stringi             1.8.7   2025-03-27 [1] RSPM
 stringr             1.5.1   2023-11-14 [1] RSPM
 survival            3.8-3   2024-12-17 [2] CRAN (R 4.5.0)
 tern              * 0.9.9   2025-06-20 [1] RSPM
 testthat            3.2.3   2025-01-13 [1] RSPM
 tibble              3.3.0   2025-06-08 [1] RSPM
 tidyr               1.3.1   2024-01-24 [1] RSPM
 tidyselect          1.2.1   2024-03-11 [1] RSPM
 vctrs               0.6.5   2023-12-01 [1] RSPM
 withr               3.0.2   2024-10-28 [1] RSPM
 xfun                0.52    2025-04-02 [1] RSPM
 yaml                2.3.10  2024-07-26 [1] RSPM

 [1] /usr/local/lib/R/site-library
 [2] /usr/local/lib/R/library
 [3] /github/home/R/x86_64-pc-linux-gnu-library/4.5
 * ── Packages attached to the search path.

──────────────────────────────────────────────────────────────────────────────

.lock file

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

Download

DMT01
EUDRAT01
Source Code
---
title: DISCLOSUREST01
subtitle: Disclosures Outputs
---

------------------------------------------------------------------------

{{< include ../../_utils/envir_hook.qmd >}}

::::::::: panel-tabset
## Patient Disposition Table <br/> (CTgov & EudraCT)

#### Data Setup

```{r setup1, message = FALSE}
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)

set.seed(1, kind = "Mersenne-Twister")

# Add additional disposition variables to adsl.
adsl0 <- adsl %>%
  mutate(
    STSTFL = case_when(
      is.na(RANDDT) ~ "N",
      TRUE ~ "Y"
    ) %>% as.factor(),
    COMPSTUD = sample(
      c("Y", "N"),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    STUDONS = sample(
      c("Alive: On Treatment", "Alive: In Follow-up", NA),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    STDDRS = sample(
      c(
        "Death", "Lost To Follow-Up",
        "Protocol Violation", "Withdrawal By Subject",
        "Other"
      ),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    GOTTRT = ifelse(!is.na(ACTARMCD), "Y", "N") %>%
      as.factor(),
    DISTRTFL = sample(
      c("Y", "N"),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    TRTDRS = sample(
      c(
        "ADVERSE EVENT", "PROGRESSIVE DISEASE",
        "PHYSICIAN DECISION", "LACK OF EFFICACY",
        "OTHER"
      ),
      size = nrow(adsl),
      replace = TRUE
    ) %>% as.factor(),
    STUDONS = case_when(COMPSTUD == "N" ~ STUDONS),
    STDDRS = case_when(COMPSTUD == "N" & is.na(STUDONS) ~ STDDRS),
    DISSTDFL = case_when(!is.na(STDDRS) ~ "Y"),
    DISTRTFL = case_when(GOTTRT == "Y" ~ DISTRTFL),
    TRTDRS = case_when(DISTRTFL == "Y" ~ TRTDRS),
    DRSCAT = case_when(
      TRTDRS %in% c("ADVERSE EVENT", "PHYSICIAN DECISION") ~ "Safety",
      !is.na(TRTDRS) ~ "Other"
    )
  ) %>%
  var_relabel(
    STSTFL = "Started Study",
    COMPSTUD = "Complete Study",
    STUDONS = "On-study Status",
    DISSTDFL = "Discontinued Study",
    STDDRS = "Reason for Study Discontinuation",
    GOTTRT = "Received Treatment",
    DISTRTFL = "Discontinued Treatment",
    TRTDRS = "Reason for Treatment Discontinuation",
    DRSCAT = "Subcategory for Treatment Discontinuation"
  )
```

```{r include = FALSE}
webr_code_labels <- c("setup1")
```

{{< include ../../_utils/webr_no_include.qmd >}}

#### Patient Disposition Table

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant1, test = list(result_v1 = "result")}
# Define the split function
split_fun <- keep_split_levels("Y")

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(
    "ARM",
    split_fun = add_overall_level("All Patients", first = FALSE)
  ) %>%
  count_values("STSTFL",
    values = "Y",
    .labels = c(count_fraction = "Started Study")
  ) %>%
  count_values("COMPSTUD",
    values = "Y",
    .labels = c(count_fraction = "Completed Study")
  ) %>%
  split_rows_by(
    "DISSTDFL",
    split_fun = split_fun
  ) %>%
  summarize_row_groups(label_fstr = "Discontinued Study") %>%
  analyze_vars(
    "STDDRS",
    .stats = "count_fraction"
  ) %>%
  append_topleft("Status")

result <- build_table(lyt = lyt, df = adsl0)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant1")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Demographic Table <br/> (CTgov & EudraCT)

#### Data Setup

```{r setup2, message = FALSE}
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)

# Change description in variable SEX.
adsl <- adsl %>%
  mutate(
    SEX = factor(case_when(
      SEX == "M" ~ "Male",
      SEX == "F" ~ "Female",
      SEX == "U" ~ "Unknown",
      SEX == "UNDIFFERENTIATED" ~ "Undifferentiated"
    )),
    AGEGRP = factor(
      case_when(
        between(AGE, 18, 40) ~ "18-40",
        between(AGE, 41, 64) ~ "41-64",
        AGE > 64 ~ ">=65"
      ),
      levels = c("18-40", "41-64", ">=65")
    )
  )
```

```{r include = FALSE}
webr_code_labels <- c("setup2")
```

{{< include ../../_utils/webr_no_include.qmd >}}

#### Demographic Table

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant2, test = list(result_v2 = "result")}
vars <- c("AGE", "AGEGRP", "SEX", "RACE", "ETHNIC")
var_labels <- c("Age (yr)", "Age group", "Sex", "Race", "Ethnicity")

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM") %>%
  add_overall_col("All Patients") %>%
  analyze_vars(
    vars = vars,
    var_labels = var_labels
  )

result <- build_table(lyt = lyt, df = adsl)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant2")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Enrollment by Country <br/> Table (EudraCT only)

#### Data Setup

```{r setup3, message = FALSE}
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl
adsl_labels <- var_labels(adsl)

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)

adsl <- adsl %>%
  mutate(COUNTRY = droplevels(COUNTRY)) %>%
  arrange(REGION1, COUNTRY)

var_labels(adsl) <- c(adsl_labels)
```

```{r include = FALSE}
webr_code_labels <- c("setup3")
```

{{< include ../../_utils/webr_no_include.qmd >}}

#### Enrollment by Country Table

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant3, test = list(result_v3 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ARM") %>%
  add_overall_col(label = "All Patients") %>%
  analyze_vars("COUNTRY") %>%
  append_varlabels(adsl, "COUNTRY")

result <- build_table(lyt, adsl)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant3")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Non-Serious Adverse Events <br/> Reported in $\geq$ 5% of Patients in Any <br/> Treatment Group (CTgov & EudraCT)

#### Data Setup

Trimming function `get_adae_trimmed` is defined to filter AEs with greater than 5% incidence rate.

```{r setup4, message = FALSE}
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl
adae <- random.cdisc.data::cadae

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)
adae <- df_explicit_na(adae)

adae_nonser <- adae %>% filter(AESER != "Y", SAFFL == "Y")

get_adae_trimmed <- function(adsl, adae, cutoff_rate) {
  n_per_arm <- adsl %>%
    dplyr::count(ARM)

  anl_terms <- adae %>%
    dplyr::group_by(ARM, AEBODSYS, AEDECOD) %>%
    dplyr::count(
      unique_terms = n_distinct(USUBJID)
    ) %>%
    dplyr::select(-n) %>%
    dplyr::ungroup()

  anl_terms <- dplyr::left_join(
    anl_terms,
    n_per_arm,
    by = "ARM"
  ) %>%
    dplyr::mutate(
      ae_rate = unique_terms / n
    ) %>%
    dplyr::filter(ae_rate >= cutoff_rate) %>%
    dplyr::select(AEDECOD) %>%
    unique()

  anl <- dplyr::left_join(
    anl_terms,
    adae,
    by = "AEDECOD"
  )
  anl
}

adae_trim <- get_adae_trimmed(adsl, adae_nonser, cutoff_rate = 0.05)
```

```{r include = FALSE}
webr_code_labels <- c("setup4")
```

{{< include ../../_utils/webr_no_include.qmd >}}

#### Non-Serious Adverse Events Report in $\geq$ 5% of Patients in Any Treatment Group

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant4, test = list(result_v4 = "result")}
# Define the split function
split_fun <- drop_split_levels

lyt <- basic_table() %>%
  split_cols_by("ARM") %>%
  summarize_patients_events_in_cols(
    custom_label = "Total number of patients with at least one non-serious adverse event occuring at a relative frequency of >=5%" # nolint: line_length.
  ) %>%
  split_rows_by("AEBODSYS",
    nested = FALSE,
    split_fun = split_fun,
    indent_mod = -1L,
    label_pos = "topleft",
    split_label = obj_label(adae_trim$AEBODSYS)
  ) %>%
  split_rows_by("AEDECOD", split_fun = split_fun, label_pos = "topleft", split_label = obj_label(adae_trim$AEDECOD)) %>%
  summarize_patients_events_in_cols(
    col_split = FALSE
  )

result <- build_table(lyt, adae_trim)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant4")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Serious Adverse Events, Fatal SAEs <br/> and SAEs Related to Study Medication, <br/> by Treatment Group (CTgov & EudraCT)

For illustrative purposes, the `adae` data is filtered by arm "A: Drug X" here.

#### Data Setup

```{r setup5, message = FALSE}
library(tern)
library(dplyr)

adae <- random.cdisc.data::cadae

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adae <- df_explicit_na(adae)

adae_serious <- adae %>% filter(AESER == "Y", SAFFL == "Y")
adae_serious_arm <- adae_serious %>% filter(ARM == "A: Drug X")

filters_list <- list(
  related = with_label(c(AEREL = "Y"), "Events (Related)"),
  fatal = with_label(c(AESDTH = "Y"), "Events (Fatal)"),
  fatal_related = with_label(c(AEREL = "Y", AESDTH = "Y"), "Events (Fatal & Related)")
)
```

```{r include = FALSE}
webr_code_labels <- c("setup5")
```

{{< include ../../_utils/webr_no_include.qmd >}}

#### Serious Adverse Events, Fatal SAEs and SAEs Related to Study Medication, by Treatment Group

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant5, test = list(result_v5 = "result")}
# Define the split function
split_fun <- drop_split_levels

lyt <- basic_table() %>%
  summarize_patients_events_in_cols(
    filters_list = filters_list,
    empty_stats = c("all", "related", "fatal", "fatal_related"),
    custom_label = "Total number of patients with at least one serious adverse event"
  ) %>%
  split_rows_by("AEBODSYS",
    nested = FALSE,
    split_fun = split_fun,
    indent_mod = -1L,
    label_pos = "topleft",
    split_label = obj_label(adae_trim$AEBODSYS)
  ) %>%
  split_rows_by("AEDECOD",
    split_fun = split_fun,
    label_pos = "topleft",
    split_label = obj_label(adae_serious_arm$AEDECOD)
  ) %>%
  summarize_patients_events_in_cols(
    filters_list = filters_list,
    col_split = FALSE
  )

result <- build_table(lyt, adae_serious_arm)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant5")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Death Table <br/> (EudraCT only)

#### Data Setup

```{r setup6, message = FALSE}
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl
adae <- random.cdisc.data::cadae
```

```{r include = FALSE}
webr_code_labels <- c("setup6")
```

{{< include ../../_utils/webr_no_include.qmd >}}

#### Death Table

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant6, test = list(result_v6 = "result")}
lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ARM") %>%
  add_overall_col("All Patients") %>%
  count_patients_with_event(
    "USUBJID",
    filters = c("AESDTH" = "Y"),
    .labels = c(count_fraction = "Total Number of Deaths"),
    .formats = c(count_fraction = "xx (xx.xx%)")
  )
result <- build_table(lyt, adae, alt_counts_df = adsl)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant6")
```

{{< include ../../_utils/webr.qmd >}}
:::
:::::::::

{{< include ../../_utils/save_results.qmd >}}

{{< include ../../repro.qmd >}}

Made with ❤️ by the NEST Team

  • Edit this page
  • Report an issue
Cookie Preferences