TLG Catalog - Dev
  • Dev
    • Stable
  1. Tables
  2. ECG
  3. EGT03
  • 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

  • Output
  • teal App
  • Reproducibility
    • Timestamp
    • Session Info
    • .lock file
  • Edit this page
  • Report an issue
  1. Tables
  2. ECG
  3. EGT03

EGT03

Shift Table of ECG Interval Data – Baseline Versus Minimum/Maximum Post-Baseline


Output

  • Table of Baseline Versus
    Minimum Post-Baseline
  • Table of Baseline Versus
    Maximum Post-Baseline
  • Data Setup

For the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purposes, missing data are added to the example dataset.

  • Preview
  • Try this using WebR
Code
set.seed(123, kind = "Mersenne-Twister")

adeg_f_pbmin$BNRIND <- factor(
  adeg_f_pbmin$BNRIND,
  levels = c("LOW", "NORMAL", "HIGH", "Missing"),
  labels = c("LOW", "NORMAL", "HIGH", "Missing")
)
adeg_f_pbmin$ANRIND <- factor(
  adeg_f_pbmin$ANRIND,
  levels = c("LOW", "NORMAL", "HIGH", "Missing"),
  labels = c("LOW", "NORMAL", "HIGH", "Missing")
)

adeg_f_pbmin$BNRIND[sample(seq_len(nrow(adeg_f_pbmin)), size = 5)] <- "Missing"
adeg_f_pbmin$ANRIND[sample(seq_len(nrow(adeg_f_pbmin)), size = 5)] <- "Missing"

attr(adeg_f_pbmin$ANRIND, "label") <- "Analysis Reference Range Indicator"
attr(adeg_f_pbmin$BNRIND, "label") <- "Baseline Reference Range Indicator"

# Temporary solution for overarching column
adeg_f_pbmin <- adeg_f_pbmin %>% mutate(min_label = "Minimum Post-Baseline Assessment")

# Define the split function
split_fun <- drop_split_levels

lyt <- basic_table() %>%
  split_cols_by("min_label") %>%
  split_cols_by("ANRIND") %>%
  split_rows_by("ARMCD", split_fun = split_fun, label_pos = "topleft", split_label = obj_label(adeg_f_pbmin$ARMCD)) %>%
  add_rowcounts() %>%
  analyze_vars("BNRIND", denom = "N_row", .stats = "count_fraction") %>%
  append_varlabels(adeg_f_pbmin, c("BNRIND"), indent = 1L)

result <- build_table(
  lyt = lyt,
  df = adeg_f_pbmin
)

result
Planned Arm Code                           Minimum Post-Baseline Assessment     
  Baseline Reference Range Indicator      LOW         NORMAL     HIGH   Missing 
————————————————————————————————————————————————————————————————————————————————
ARM A (N=134)                                                                   
  LOW                                   1 (0.7%)     5 (3.7%)     0        0    
  NORMAL                               36 (26.9%)   83 (61.9%)    0     1 (0.7%)
  HIGH                                  2 (1.5%)      4 (3%)      0        0    
  Missing                               1 (0.7%)        0         0     1 (0.7%)
ARM B (N=134)                                                                   
  LOW                                   1 (0.7%)     9 (6.7%)     0        0    
  NORMAL                               40 (29.9%)    75 (56%)     0     2 (1.5%)
  HIGH                                  1 (0.7%)      4 (3%)      0        0    
  Missing                               1 (0.7%)     1 (0.7%)     0        0    
ARM C (N=132)                                                                   
  LOW                                    4 (3%)     11 (8.3%)     0        0    
  NORMAL                               31 (23.5%)   75 (56.8%)    0        0    
  HIGH                                  1 (0.8%)     8 (6.1%)     0     1 (0.8%)
  Missing                               1 (0.8%)        0         0        0    
WarningExperimental 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 the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purpose, missing data are added to the example dataset.

  • Preview
  • Try this using WebR
Code
set.seed(123, kind = "Mersenne-Twister")

adeg_f_pbmax$BNRIND <- factor(
  adeg_f_pbmax$BNRIND,
  levels = c("LOW", "NORMAL", "HIGH", "Missing"),
  labels = c("LOW", "NORMAL", "HIGH", "Missing")
)
adeg_f_pbmax$ANRIND <- factor(
  adeg_f_pbmax$ANRIND,
  levels = c("LOW", "NORMAL", "HIGH", "Missing"),
  labels = c("LOW", "NORMAL", "HIGH", "Missing")
)

adeg_f_pbmax$BNRIND[sample(seq_len(nrow(adeg_f_pbmax)), size = 5)] <- "Missing"
adeg_f_pbmax$ANRIND[sample(seq_len(nrow(adeg_f_pbmax)), size = 5)] <- "Missing"

attr(adeg_f_pbmax$ANRIND, "label") <- "Analysis Reference Range Indicator"
attr(adeg_f_pbmax$BNRIND, "label") <- "Baseline Reference Range Indicator"

# Temporary solution for overarching column
adeg_f_pbmax <- adeg_f_pbmax %>% mutate(max_label = "Maximum Post-Baseline Assessment")

# Define the split function
split_fun <- drop_split_levels

lyt <- basic_table() %>%
  split_cols_by("max_label") %>%
  split_cols_by("ANRIND") %>%
  split_rows_by("ARMCD", split_fun = split_fun, label_pos = "topleft", split_label = obj_label(adeg_f_pbmax$ARMCD)) %>%
  add_rowcounts() %>%
  analyze_vars("BNRIND", denom = "N_row", .stats = "count_fraction") %>%
  append_varlabels(adeg_f_pbmax, c("BNRIND"), indent = 1L)

result <- build_table(
  lyt = lyt,
  df = adeg_f_pbmax
)

result
Planned Arm Code                           Maximum Post-Baseline Assessment     
  Baseline Reference Range Indicator   LOW      NORMAL        HIGH      Missing 
————————————————————————————————————————————————————————————————————————————————
ARM A (N=134)                                                                   
  LOW                                   0      2 (1.5%)      4 (3%)        0    
  NORMAL                                0     88 (65.7%)   31 (23.1%)   1 (0.7%)
  HIGH                                  0      5 (3.7%)     1 (0.7%)       0    
  Missing                               0         0         1 (0.7%)    1 (0.7%)
ARM B (N=134)                                                                   
  LOW                                   0       8 (6%)      2 (1.5%)       0    
  NORMAL                                0     76 (56.7%)   39 (29.1%)   2 (1.5%)
  HIGH                                  0      3 (2.2%)     2 (1.5%)       0    
  Missing                               0      1 (0.7%)     1 (0.7%)       0    
ARM C (N=132)                                                                   
  LOW                                   0     12 (9.1%)     3 (2.3%)       0    
  NORMAL                                0     79 (59.8%)   27 (20.5%)      0    
  HIGH                                  0      5 (3.8%)      4 (3%)     1 (0.8%)
  Missing                               0         0         1 (0.8%)       0    
WarningExperimental 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.

Code
library(tern)
library(dplyr)

adeg <- random.cdisc.data::cadeg

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

adeg_labels <- var_labels(adeg)

adeg_f_pbmin <- subset(
  adeg,
  PARAMCD == "HR" & # Heart Rate
    SAFFL == "Y" & # "Safety Population Flag"
    ONTRTFL == "Y" & # "On Treatment Record Flag"
    AVISIT == "POST-BASELINE MINIMUM" # "Analysis Visit"
)

adeg_f_pbmax <- subset(
  adeg,
  PARAMCD == "HR" & # Heart Rate
    SAFFL == "Y" & # "Safety Population Flag"
    ONTRTFL == "Y" & # "On Treatment Record Flag"
    AVISIT == "POST-BASELINE MAXIMUM" # "Analysis Visit"
)

var_labels(adeg_f_pbmin) <- adeg_labels
var_labels(adeg_f_pbmax) <- adeg_labels

teal App

  • Preview
  • Try this using shinylive
Code
library(teal.modules.clinical)

## Data reproducible code
data <- teal_data()
data <- within(data, {
  ADSL <- random.cdisc.data::cadsl
  ADEG <- random.cdisc.data::cadeg
})
join_keys(data) <- default_cdisc_join_keys[c("ADSL", "ADEG")]

## Reusable Configuration For Modules
ADSL <- data[["ADSL"]]
ADEG <- data[["ADEG"]]

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_shift_by_arm(
      label = "Shift by Arm Table",
      dataname = "ADEG",
      arm_var = choices_selected(
        variable_choices(ADSL, subset = c("ARM", "ARMCD")),
        selected = "ARM"
      ),
      paramcd = choices_selected(
        value_choices(ADEG, "PARAMCD"),
        selected = "HR"
      ),
      visit_var = choices_selected(
        value_choices(ADEG, "AVISIT"),
        selected = "POST-BASELINE MINIMUM"
      ),
      aval_var = choices_selected(
        variable_choices(ADEG, subset = "ANRIND"),
        selected = "ANRIND", fixed = TRUE
      ),
      baseline_var = choices_selected(
        variable_choices(ADEG, subset = "BNRIND"),
        selected = "BNRIND", fixed = TRUE
      ),
      treatment_flag_var = choices_selected(
        variable_choices(ADEG, subset = "ONTRTFL"),
        selected = "ONTRTFL", fixed = TRUE
      ),
      treatment_flag = choices_selected(
        value_choices(ADEG, "ONTRTFL"),
        selected = "Y", fixed = TRUE
      )
    )
  ),
  filter = teal_slices(teal_slice("ADSL", "SAFFL", selected = "Y"))
)

shinyApp(app$ui, app$server)

WarningExperimental use!

shinylive allow you to modify to run shiny application entirely in the web browser. Modify the code below and click re-run the app to see the results. The performance is slighly worse and some of the features (e.g. downloading) might not work at all.

#| '!! shinylive warning !!': |
#|   shinylive does not work in self-contained HTML documents.
#|   Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 800
#| editorHeight: 200
#| components: [viewer, editor]
#| layout: vertical

# -- WEBR HELPERS --
options(webr_pkg_repos = c("r-universe" = "https://pharmaverse.r-universe.dev", getOption("webr_pkg_repos")))

# -- APP CODE --
library(teal.modules.clinical)

## Data reproducible code
data <- teal_data()
data <- within(data, {
  ADSL <- random.cdisc.data::cadsl
  ADEG <- random.cdisc.data::cadeg
})
join_keys(data) <- default_cdisc_join_keys[c("ADSL", "ADEG")]

## Reusable Configuration For Modules
ADSL <- data[["ADSL"]]
ADEG <- data[["ADEG"]]

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_shift_by_arm(
      label = "Shift by Arm Table",
      dataname = "ADEG",
      arm_var = choices_selected(
        variable_choices(ADSL, subset = c("ARM", "ARMCD")),
        selected = "ARM"
      ),
      paramcd = choices_selected(
        value_choices(ADEG, "PARAMCD"),
        selected = "HR"
      ),
      visit_var = choices_selected(
        value_choices(ADEG, "AVISIT"),
        selected = "POST-BASELINE MINIMUM"
      ),
      aval_var = choices_selected(
        variable_choices(ADEG, subset = "ANRIND"),
        selected = "ANRIND", fixed = TRUE
      ),
      baseline_var = choices_selected(
        variable_choices(ADEG, subset = "BNRIND"),
        selected = "BNRIND", fixed = TRUE
      ),
      treatment_flag_var = choices_selected(
        variable_choices(ADEG, subset = "ONTRTFL"),
        selected = "ONTRTFL", fixed = TRUE
      ),
      treatment_flag = choices_selected(
        value_choices(ADEG, "ONTRTFL"),
        selected = "Y", fixed = TRUE
      )
    )
  ),
  filter = teal_slices(teal_slice("ADSL", "SAFFL", selected = "Y"))
)

shinyApp(app$ui, app$server)

Reproducibility

Timestamp

[1] "2026-06-13 18:07:15 UTC"

Session Info

─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.5.2 (2025-10-31)
 os       Ubuntu 24.04.4 LTS
 system   x86_64, linux-gnu
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       Etc/UTC
 date     2026-06-13
 pandoc   3.9 @ /usr/bin/ (via rmarkdown)
 quarto   1.9.38 @ /usr/local/bin/quarto

─ Packages ───────────────────────────────────────────────────────────────────
 package               * version     date (UTC) lib source
 backports               1.5.1       2026-04-03 [1] CRAN (R 4.5.2)
 brio                    1.1.5       2024-04-24 [1] CRAN (R 4.5.2)
 broom                   1.0.13      2026-05-14 [1] CRAN (R 4.5.2)
 bsicons                 0.1.2       2023-11-04 [1] CRAN (R 4.5.2)
 bslib                   0.11.0      2026-05-16 [1] CRAN (R 4.5.2)
 cachem                  1.1.0       2024-05-16 [1] CRAN (R 4.5.2)
 callr                   3.8.0       2026-06-05 [1] CRAN (R 4.5.2)
 checkmate               2.3.4       2026-02-03 [1] CRAN (R 4.5.2)
 chromote                0.5.1       2025-04-24 [1] CRAN (R 4.5.2)
 cli                     3.6.6       2026-04-09 [1] CRAN (R 4.5.2)
 codetools               0.2-20      2024-03-31 [2] CRAN (R 4.5.2)
 curl                    7.1.0       2026-04-22 [1] CRAN (R 4.5.2)
 dichromat               2.0-0.1     2022-05-02 [1] CRAN (R 4.5.2)
 digest                  0.6.39      2025-11-19 [1] CRAN (R 4.5.2)
 dplyr                 * 1.2.1       2026-04-03 [1] CRAN (R 4.5.2)
 evaluate                1.0.5       2025-08-27 [1] CRAN (R 4.5.2)
 farver                  2.1.2       2024-05-13 [1] CRAN (R 4.5.2)
 fastmap                 1.2.0       2024-05-15 [1] CRAN (R 4.5.2)
 fontawesome             0.5.3       2024-11-16 [1] CRAN (R 4.5.2)
 forcats                 1.0.1       2025-09-25 [1] CRAN (R 4.5.2)
 formatR                 1.14        2023-01-17 [1] CRAN (R 4.5.2)
 formatters            * 0.5.12.9003 2026-05-21 [1] https://p~
 fs                      2.1.0       2026-04-18 [1] CRAN (R 4.5.2)
 generics                0.1.4       2025-05-09 [1] CRAN (R 4.5.2)
 ggplot2                 4.0.3       2026-04-22 [1] CRAN (R 4.5.2)
 glue                    1.8.1       2026-04-17 [1] CRAN (R 4.5.2)
 gtable                  0.3.6       2024-10-25 [1] CRAN (R 4.5.2)
 htmltools               0.5.9       2025-12-04 [1] CRAN (R 4.5.2)
 htmlwidgets             1.6.4       2023-12-06 [1] CRAN (R 4.5.2)
 httpuv                  1.6.17      2026-03-18 [1] CRAN (R 4.5.2)
 jquerylib               0.1.4       2021-04-26 [1] CRAN (R 4.5.2)
 jsonlite                2.0.0       2025-03-27 [1] CRAN (R 4.5.2)
 knitr                   1.51        2025-12-20 [1] CRAN (R 4.5.2)
 later                   1.4.8       2026-03-05 [1] CRAN (R 4.5.2)
 lattice                 0.22-9      2026-02-09 [2] CRAN (R 4.5.2)
 lifecycle               1.0.5       2026-01-08 [1] CRAN (R 4.5.2)
 logger                  0.4.2       2026-05-10 [1] CRAN (R 4.5.2)
 magrittr              * 2.0.5       2026-04-04 [1] CRAN (R 4.5.2)
 Matrix                  1.7-5       2026-03-21 [1] CRAN (R 4.5.2)
 memoise                 2.0.1       2021-11-26 [1] CRAN (R 4.5.2)
 mime                    0.13        2025-03-17 [1] CRAN (R 4.5.2)
 nestcolor               0.1.3.9000  2025-01-21 [1] https://p~
 otel                    0.2.0       2025-08-29 [1] CRAN (R 4.5.2)
 pillar                  1.11.1      2025-09-17 [1] CRAN (R 4.5.2)
 pkgcache                2.2.5       2026-04-09 [1] CRAN (R 4.5.2)
 pkgconfig               2.0.3       2019-09-22 [1] CRAN (R 4.5.2)
 processx                3.9.0       2026-04-22 [1] CRAN (R 4.5.2)
 promises                1.5.0       2025-11-01 [1] CRAN (R 4.5.2)
 ps                      1.9.3       2026-04-20 [1] CRAN (R 4.5.2)
 purrr                   1.2.2       2026-04-10 [1] CRAN (R 4.5.2)
 R6                      2.6.1       2025-02-15 [1] CRAN (R 4.5.2)
 ragg                    1.5.2       2026-03-23 [1] CRAN (R 4.5.2)
 random.cdisc.data       0.3.16.9007 2025-11-13 [1] https://p~
 rbibutils               2.4.1       2026-01-21 [1] CRAN (R 4.5.2)
 RColorBrewer            1.1-3       2022-04-03 [1] CRAN (R 4.5.2)
 Rcpp                    1.1.1-1.1   2026-04-24 [1] CRAN (R 4.5.2)
 Rdpack                  2.6.6       2026-02-08 [1] CRAN (R 4.5.2)
 rlang                   1.2.0       2026-04-06 [1] CRAN (R 4.5.2)
 rmarkdown               2.31        2026-03-26 [1] CRAN (R 4.5.2)
 rtables               * 0.6.16.9001 2026-05-21 [1] https://p~
 S7                      0.2.2       2026-04-22 [1] CRAN (R 4.5.2)
 sass                    0.4.10      2025-04-11 [1] CRAN (R 4.5.2)
 scales                  1.4.0       2025-04-24 [1] CRAN (R 4.5.2)
 sessioninfo             1.2.4       2026-06-04 [1] CRAN (R 4.5.2)
 shiny                 * 1.13.0      2026-02-20 [1] CRAN (R 4.5.2)
 shinycssloaders         1.1.0       2024-07-30 [1] CRAN (R 4.5.2)
 shinyjs                 2.1.1       2026-01-15 [1] CRAN (R 4.5.2)
 shinyvalidate           0.1.3       2023-10-04 [1] CRAN (R 4.5.2)
 shinyWidgets            0.9.1       2026-03-09 [1] CRAN (R 4.5.2)
 stringi                 1.8.7       2025-03-27 [1] CRAN (R 4.5.2)
 stringr                 1.6.0       2025-11-04 [1] CRAN (R 4.5.2)
 survival                3.8-6       2026-01-16 [2] CRAN (R 4.5.2)
 systemfonts             1.3.2       2026-03-05 [1] CRAN (R 4.5.2)
 teal                  * 1.1.0.9033  2026-05-27 [1] https://p~
 teal.code             * 0.7.1.9003  2026-04-23 [1] https://p~
 teal.data             * 0.8.0.9002  2025-12-15 [1] https://p~
 teal.logger             0.4.1.9004  2026-02-10 [1] https://p~
 teal.modules.clinical * 0.12.0.9013 2026-04-08 [1] https://p~
 teal.reporter           0.6.1.9000  2026-02-20 [1] https://p~
 teal.slice            * 0.8.0       2026-06-04 [1] CRAN (R 4.5.2)
 teal.transform        * 0.7.1.9003  2026-02-17 [1] https://p~
 teal.widgets            0.6.0.9001  2026-03-11 [1] https://p~
 tern                  * 0.9.10.9012 2026-06-11 [1] https://p~
 testthat                3.3.2       2026-01-11 [1] CRAN (R 4.5.2)
 textshaping             1.0.5       2026-03-06 [1] CRAN (R 4.5.2)
 tibble                  3.3.1       2026-01-11 [1] CRAN (R 4.5.2)
 tidyr                   1.3.2       2025-12-19 [1] CRAN (R 4.5.2)
 tidyselect              1.2.1       2024-03-11 [1] CRAN (R 4.5.2)
 vctrs                   0.7.3       2026-04-11 [1] CRAN (R 4.5.2)
 webshot                 0.5.5       2023-06-26 [1] CRAN (R 4.5.2)
 webshot2                0.1.2       2025-04-23 [1] CRAN (R 4.5.2)
 websocket               1.4.4       2025-04-10 [1] CRAN (R 4.5.2)
 withr                   3.0.2       2024-10-28 [1] CRAN (R 4.5.2)
 xfun                    0.58        2026-06-01 [1] CRAN (R 4.5.2)
 xtable                  1.8-8       2026-02-22 [1] CRAN (R 4.5.2)
 yaml                    2.3.12      2025-12-10 [1] CRAN (R 4.5.2)

 [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

EGT02
EGT04
Source Code
---
title: EGT03
subtitle: Shift Table of ECG Interval Data -- Baseline Versus Minimum/Maximum Post-Baseline
---

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

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

```{r setup, echo = FALSE, warning = FALSE, message = FALSE}
library(tern)
library(dplyr)

adeg <- random.cdisc.data::cadeg

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

adeg_labels <- var_labels(adeg)

adeg_f_pbmin <- subset(
  adeg,
  PARAMCD == "HR" & # Heart Rate
    SAFFL == "Y" & # "Safety Population Flag"
    ONTRTFL == "Y" & # "On Treatment Record Flag"
    AVISIT == "POST-BASELINE MINIMUM" # "Analysis Visit"
)

adeg_f_pbmax <- subset(
  adeg,
  PARAMCD == "HR" & # Heart Rate
    SAFFL == "Y" & # "Safety Population Flag"
    ONTRTFL == "Y" & # "On Treatment Record Flag"
    AVISIT == "POST-BASELINE MAXIMUM" # "Analysis Visit"
)

var_labels(adeg_f_pbmin) <- adeg_labels
var_labels(adeg_f_pbmax) <- adeg_labels
```

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

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

## Output

::::: panel-tabset
## Table of Baseline Versus <br/> Minimum Post-Baseline

For the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purposes, missing data are added to the example dataset.

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

```{r variant1, test = list(result_v1 = "result")}
set.seed(123, kind = "Mersenne-Twister")

adeg_f_pbmin$BNRIND <- factor(
  adeg_f_pbmin$BNRIND,
  levels = c("LOW", "NORMAL", "HIGH", "Missing"),
  labels = c("LOW", "NORMAL", "HIGH", "Missing")
)
adeg_f_pbmin$ANRIND <- factor(
  adeg_f_pbmin$ANRIND,
  levels = c("LOW", "NORMAL", "HIGH", "Missing"),
  labels = c("LOW", "NORMAL", "HIGH", "Missing")
)

adeg_f_pbmin$BNRIND[sample(seq_len(nrow(adeg_f_pbmin)), size = 5)] <- "Missing"
adeg_f_pbmin$ANRIND[sample(seq_len(nrow(adeg_f_pbmin)), size = 5)] <- "Missing"

attr(adeg_f_pbmin$ANRIND, "label") <- "Analysis Reference Range Indicator"
attr(adeg_f_pbmin$BNRIND, "label") <- "Baseline Reference Range Indicator"

# Temporary solution for overarching column
adeg_f_pbmin <- adeg_f_pbmin %>% mutate(min_label = "Minimum Post-Baseline Assessment")

# Define the split function
split_fun <- drop_split_levels

lyt <- basic_table() %>%
  split_cols_by("min_label") %>%
  split_cols_by("ANRIND") %>%
  split_rows_by("ARMCD", split_fun = split_fun, label_pos = "topleft", split_label = obj_label(adeg_f_pbmin$ARMCD)) %>%
  add_rowcounts() %>%
  analyze_vars("BNRIND", denom = "N_row", .stats = "count_fraction") %>%
  append_varlabels(adeg_f_pbmin, c("BNRIND"), indent = 1L)

result <- build_table(
  lyt = lyt,
  df = adeg_f_pbmin
)

result
```

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

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

## Table of Baseline Versus <br/> Maximum Post-Baseline

For the EGT03 template, data imputation should be avoided, and missing data explicit and accounted for, so the contingency table sum adds up to the group N. For illustration purpose, missing data are added to the example dataset.

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

```{r variant2, test = list(result_v2 = "result")}
set.seed(123, kind = "Mersenne-Twister")

adeg_f_pbmax$BNRIND <- factor(
  adeg_f_pbmax$BNRIND,
  levels = c("LOW", "NORMAL", "HIGH", "Missing"),
  labels = c("LOW", "NORMAL", "HIGH", "Missing")
)
adeg_f_pbmax$ANRIND <- factor(
  adeg_f_pbmax$ANRIND,
  levels = c("LOW", "NORMAL", "HIGH", "Missing"),
  labels = c("LOW", "NORMAL", "HIGH", "Missing")
)

adeg_f_pbmax$BNRIND[sample(seq_len(nrow(adeg_f_pbmax)), size = 5)] <- "Missing"
adeg_f_pbmax$ANRIND[sample(seq_len(nrow(adeg_f_pbmax)), size = 5)] <- "Missing"

attr(adeg_f_pbmax$ANRIND, "label") <- "Analysis Reference Range Indicator"
attr(adeg_f_pbmax$BNRIND, "label") <- "Baseline Reference Range Indicator"

# Temporary solution for overarching column
adeg_f_pbmax <- adeg_f_pbmax %>% mutate(max_label = "Maximum Post-Baseline Assessment")

# Define the split function
split_fun <- drop_split_levels

lyt <- basic_table() %>%
  split_cols_by("max_label") %>%
  split_cols_by("ANRIND") %>%
  split_rows_by("ARMCD", split_fun = split_fun, label_pos = "topleft", split_label = obj_label(adeg_f_pbmax$ARMCD)) %>%
  add_rowcounts() %>%
  analyze_vars("BNRIND", denom = "N_row", .stats = "count_fraction") %>%
  append_varlabels(adeg_f_pbmax, c("BNRIND"), indent = 1L)

result <- build_table(
  lyt = lyt,
  df = adeg_f_pbmax
)

result
```

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

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

## Data Setup

```{r setup}
#| code-fold: show
```
:::::

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

## `teal` App

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

```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)

## Data reproducible code
data <- teal_data()
data <- within(data, {
  ADSL <- random.cdisc.data::cadsl
  ADEG <- random.cdisc.data::cadeg
})
join_keys(data) <- default_cdisc_join_keys[c("ADSL", "ADEG")]

## Reusable Configuration For Modules
ADSL <- data[["ADSL"]]
ADEG <- data[["ADEG"]]

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_shift_by_arm(
      label = "Shift by Arm Table",
      dataname = "ADEG",
      arm_var = choices_selected(
        variable_choices(ADSL, subset = c("ARM", "ARMCD")),
        selected = "ARM"
      ),
      paramcd = choices_selected(
        value_choices(ADEG, "PARAMCD"),
        selected = "HR"
      ),
      visit_var = choices_selected(
        value_choices(ADEG, "AVISIT"),
        selected = "POST-BASELINE MINIMUM"
      ),
      aval_var = choices_selected(
        variable_choices(ADEG, subset = "ANRIND"),
        selected = "ANRIND", fixed = TRUE
      ),
      baseline_var = choices_selected(
        variable_choices(ADEG, subset = "BNRIND"),
        selected = "BNRIND", fixed = TRUE
      ),
      treatment_flag_var = choices_selected(
        variable_choices(ADEG, subset = "ONTRTFL"),
        selected = "ONTRTFL", fixed = TRUE
      ),
      treatment_flag = choices_selected(
        value_choices(ADEG, "ONTRTFL"),
        selected = "Y", fixed = TRUE
      )
    )
  ),
  filter = teal_slices(teal_slice("ADSL", "SAFFL", selected = "Y"))
)

shinyApp(app$ui, app$server)
```

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

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

Made with ❤️ by the NEST Team

  • Edit this page
  • Report an issue
Cookie Preferences