TLG Catalog - Stable
  • Stable
    • Dev
  1. Tables
  2. ECG
  3. EGT04
  • 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
  • Reproducibility
    • Timestamp
    • Session Info
    • .lock file
  • Edit this page
  • Report an issue
  1. Tables
  2. ECG
  3. EGT04

EGT04

Shift Table of Qualitative ECG Assessments


Output

  • Standard Table
  • Data Setup

The EGT04 template consists of a stacked list of contingency tables, one per group. For each group, the n’s across all cells must add up to the group N in the analysis, and percentages are calculated using N as the denominator.

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

lyt <- basic_table() %>%
  split_cols_by("postbaseline_label") %>%
  split_cols_by("AVALC") %>%
  split_rows_by("ARM", split_fun = split_fun, label_pos = "topleft", split_label = obj_label(adeg_f$ARM)) %>%
  add_rowcounts() %>%
  analyze_vars(
    "BASEC",
    denom = "N_row",
    .stats = "count_fraction",
    na.rm = FALSE
  ) %>%
  append_varlabels(adeg_f, c("BASEC"), indent = 1L)

result <- build_table(lyt, adeg_f)
result
Description of Planned Arm             Post-Baseline           
  Baseline                     Normal      Abnormal    Missing 
———————————————————————————————————————————————————————————————
A: Drug X (N=134)                                              
  Normal                     20 (14.9%)   81 (60.4%)   1 (0.7%)
  Abnormal                   11 (8.2%)    19 (14.2%)      0    
  Missing                        0         1 (0.7%)    1 (0.7%)
B: Placebo (N=134)                                             
  Normal                     18 (13.4%)   81 (60.4%)   2 (1.5%)
  Abnormal                    3 (2.2%)    28 (20.9%)      0    
  Missing                        0         2 (1.5%)       0    
C: Combination (N=132)                                         
  Normal                     26 (19.7%)   69 (52.3%)   1 (0.8%)
  Abnormal                    6 (4.5%)     29 (22%)       0    
  Missing                     1 (0.8%)        0           0    
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 the EGT04 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.

Code
library(tern)
library(dplyr)
set.seed(123)

adsl <- random.cdisc.data::cadsl
adeg <- random.cdisc.data::cadeg

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)
adeg <- df_explicit_na(adeg, omit_columns = c("AVALC", "BASEC"))

adeg_labels <- var_labels(adeg)

adeg_f <- subset(
  adeg,
  PARAMCD == "ECGINTP" & # Analysis in terms of "NORMAL"/"ABNORMAL" (AVALC)
    SAFFL == "Y" & # "Safety Population Flag"
    ONTRTFL == "Y" & # "On Treatment Record Flag"
    WORS02FL == "Y" # "Worst Post-Baseline Observation"
)

adeg_f$AVALC[sample(seq_len(nrow(adeg_f)), size = 5)] <- "Missing"
adeg_f$BASEC[sample(seq_len(nrow(adeg_f)), size = 5)] <- "Missing"
adeg_f$AVALC <- factor(
  adeg_f$AVALC,
  levels = c("NORMAL", "ABNORMAL", "Missing"),
  labels = c("Normal", "Abnormal", "Missing")
)
adeg_f$BASEC <- factor(
  adeg_f$BASEC,
  levels = c("NORMAL", "ABNORMAL", "Missing"),
  labels = c("Normal", "Abnormal", "Missing")
)

var_labels(adeg_f) <- adeg_labels
adeg_f <- adeg_f %>%
  var_relabel(BASEC = "Baseline")

# Temprary solution for over arching column
adeg_f <- adeg_f %>% mutate(postbaseline_label = "Post-Baseline")

Reproducibility

Timestamp

[1] "2025-07-05 17:41:45 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-05
 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
 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

EGT03
EGT05_QTCAT
Source Code
---
title: EGT04
subtitle: Shift Table of Qualitative ECG Assessments
---

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

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

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

adsl <- random.cdisc.data::cadsl
adeg <- random.cdisc.data::cadeg

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)
adeg <- df_explicit_na(adeg, omit_columns = c("AVALC", "BASEC"))

adeg_labels <- var_labels(adeg)

adeg_f <- subset(
  adeg,
  PARAMCD == "ECGINTP" & # Analysis in terms of "NORMAL"/"ABNORMAL" (AVALC)
    SAFFL == "Y" & # "Safety Population Flag"
    ONTRTFL == "Y" & # "On Treatment Record Flag"
    WORS02FL == "Y" # "Worst Post-Baseline Observation"
)

adeg_f$AVALC[sample(seq_len(nrow(adeg_f)), size = 5)] <- "Missing"
adeg_f$BASEC[sample(seq_len(nrow(adeg_f)), size = 5)] <- "Missing"
adeg_f$AVALC <- factor(
  adeg_f$AVALC,
  levels = c("NORMAL", "ABNORMAL", "Missing"),
  labels = c("Normal", "Abnormal", "Missing")
)
adeg_f$BASEC <- factor(
  adeg_f$BASEC,
  levels = c("NORMAL", "ABNORMAL", "Missing"),
  labels = c("Normal", "Abnormal", "Missing")
)

var_labels(adeg_f) <- adeg_labels
adeg_f <- adeg_f %>%
  var_relabel(BASEC = "Baseline")

# Temprary solution for over arching column
adeg_f <- adeg_f %>% mutate(postbaseline_label = "Post-Baseline")
```

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

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

## Output

:::: panel-tabset
## Standard Table

The EGT04 template consists of a stacked list of contingency tables, one per group. For each group, the n's across all cells must add up to the group N in the analysis, and percentages are calculated using N as the denominator.

::: {.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 <- drop_split_levels

lyt <- basic_table() %>%
  split_cols_by("postbaseline_label") %>%
  split_cols_by("AVALC") %>%
  split_rows_by("ARM", split_fun = split_fun, label_pos = "topleft", split_label = obj_label(adeg_f$ARM)) %>%
  add_rowcounts() %>%
  analyze_vars(
    "BASEC",
    denom = "N_row",
    .stats = "count_fraction",
    na.rm = FALSE
  ) %>%
  append_varlabels(adeg_f, c("BASEC"), indent = 1L)

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

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

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

## Data Setup

For the EGT04 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.

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

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

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

Made with ❤️ by the NEST Team

  • Edit this page
  • Report an issue
Cookie Preferences