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.
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::cadsladeg <- 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_labelsadeg_f <- adeg_f %>%var_relabel(BASEC ="Baseline")# Temprary solution for over arching columnadeg_f <- adeg_f %>%mutate(postbaseline_label ="Post-Baseline")
---title: EGT04subtitle: 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::cadsladeg <- 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_labelsadeg_f <- adeg_f %>% var_relabel(BASEC = "Baseline")# Temprary solution for over arching columnadeg_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 TableThe 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 functionsplit_fun <- drop_split_levelslyt <- 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 SetupFor 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 >}}