TLG Catalog - Stable
  • Stable
    • Dev
  1. Tables
  2. Lab Results
  3. LBT14
  • 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. Lab Results
  3. LBT14

LBT14

Laboratory Test Results Shift Table – Highest NCI CTCAE Grade Post-Baseline by Baseline NCI CTCAE Grade


Output

  • Standard Table (High)
  • Standard Table (Low)
  • Table Without Patients with
    Missing Baseline (High)
  • Table with Missing Baseline
    Considered as Grade 0 (Low)
  • Table with Fill-In of Grades
  • Data Setup

Note that the worst laboratory flag (below WGRHIFL) must be selected appropriately in the pre-processing step. New grouping variables ATOXGR_GP (post-baseline) and BTOXGR_GP (baseline) are created to display the correct output.

  • Preview
  • Try this using WebR
Code
adlb_f <- adlb %>% filter(WGRHIFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRHIFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      ATOXGR == 1 ~ "1",
      ATOXGR == 2 ~ "2",
      ATOXGR == 3 ~ "3",
      ATOXGR == 4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      BTOXGR == 1 ~ "1",
      BTOXGR == 2 ~ "2",
      BTOXGR == 3 ~ "3",
      BTOXGR == 4 ~ "4",
      BTOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f) %>%
  prune_table()

result
Parameter                                                                             
      Baseline NCI-CTCAE Grade                A: Drug X    B: Placebo   C: Combination
              Post-baseline NCI-CTCAE Grade    (N=134)      (N=134)        (N=132)    
——————————————————————————————————————————————————————————————————————————————————————
Alanine Aminotransferase Measurement                                                  
      Not High                                   134          134            132      
              Not High                        134 (100%)   134 (100%)     132 (100%)  
C-Reactive Protein Measurement                                                        
      Not High                                   114          112            115      
              Not High                        45 (39.5%)   55 (49.1%)     57 (49.6%)  
              1                               18 (15.8%)   18 (16.1%)     19 (16.5%)  
              2                               19 (16.7%)   10 (8.9%)      11 (9.6%)   
              3                               22 (19.3%)   13 (11.6%)     20 (17.4%)  
              4                               10 (8.8%)    16 (14.3%)      8 (7.0%)   
      1                                           8            10             7       
              Not High                        5 (62.5%)    2 (20.0%)      2 (28.6%)   
              1                                   0        1 (10.0%)          0       
              2                               1 (12.5%)    3 (30.0%)      3 (42.9%)   
              3                               1 (12.5%)    1 (10.0%)          0       
              4                               1 (12.5%)    3 (30.0%)      2 (28.6%)   
      2                                           2            6              7       
              Not High                        1 (50.0%)    4 (66.7%)      4 (57.1%)   
              1                                   0        1 (16.7%)      2 (28.6%)   
              2                               1 (50.0%)    1 (16.7%)          0       
              4                                   0            0          1 (14.3%)   
      3                                           7            4              3       
              Not High                        3 (42.9%)        0          2 (66.7%)   
              1                               2 (28.6%)    1 (25.0%)      1 (33.3%)   
              2                                   0        1 (25.0%)          0       
              3                               1 (14.3%)    1 (25.0%)          0       
              4                               1 (14.3%)    1 (25.0%)          0       
      4                                           3            2              0       
              Not High                        1 (33.3%)        0              0       
              1                                   0        1 (50.0%)          0       
              3                               1 (33.3%)    1 (50.0%)          0       
              4                               1 (33.3%)        0              0       
Immunoglobulin A Measurement                                                          
      Not High                                   119          116            113      
              Not High                        55 (46.2%)   54 (46.6%)     51 (45.1%)  
              1                               18 (15.1%)   11 (9.5%)      15 (13.3%)  
              2                               14 (11.8%)   22 (19.0%)     19 (16.8%)  
              3                               20 (16.8%)   19 (16.4%)     20 (17.7%)  
              4                               12 (10.1%)   10 (8.6%)       8 (7.1%)   
      1                                           5            4              2       
              Not High                        4 (80.0%)    1 (25.0%)       2 (100%)   
              2                               1 (20.0%)    1 (25.0%)          0       
              3                                   0        2 (50.0%)          0       
      2                                           4            4              5       
              Not High                        2 (50.0%)    3 (75.0%)      3 (60.0%)   
              1                               1 (25.0%)        0          2 (40.0%)   
              3                               1 (25.0%)        0              0       
              4                                   0        1 (25.0%)          0       
      3                                           4            5              11      
              Not High                        3 (75.0%)    1 (20.0%)      6 (54.5%)   
              1                                   0        1 (20.0%)       1 (9.1%)   
              2                               1 (25.0%)        0              0       
              3                                   0        2 (40.0%)      3 (27.3%)   
              4                                   0        1 (20.0%)       1 (9.1%)   
      4                                           2            5              1       
              Not High                            0        3 (60.0%)       1 (100%)   
              2                               1 (50.0%)    1 (20.0%)          0       
              4                               1 (50.0%)    1 (20.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.

Note that the worst laboratory flag (below WGRLOFL) must be selected appropriately in the pre-processing step. New grouping variables ATOXGR_GP (post-baseline) and BTOXGR_GP (baseline) are created to display the correct output.

  • Preview
  • Try this using WebR
Code
adlb_f <- adlb %>% filter(WGRLOFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRLOFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, 1, 2, 3, 4) ~ "Not Low",
      ATOXGR == -1 ~ "1",
      ATOXGR == -2 ~ "2",
      ATOXGR == -3 ~ "3",
      ATOXGR == -4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not Low", "1", "2", "3", "4", "Missing"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, 1, 2, 3, 4) ~ "Not Low",
      BTOXGR == -1 ~ "1",
      BTOXGR == -2 ~ "2",
      BTOXGR == -3 ~ "3",
      BTOXGR == -4 ~ "4",
      BTOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not Low", "1", "2", "3", "4", "Missing"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f) %>%
  prune_table()

result
Parameter                                                                             
      Baseline NCI-CTCAE Grade                A: Drug X    B: Placebo   C: Combination
              Post-baseline NCI-CTCAE Grade    (N=134)      (N=134)        (N=132)    
——————————————————————————————————————————————————————————————————————————————————————
Alanine Aminotransferase Measurement                                                  
      Not Low                                    113          117            123      
              Not Low                         56 (49.6%)   55 (47.0%)     62 (50.4%)  
              1                               11 (9.7%)     9 (7.7%)      15 (12.2%)  
              2                               15 (13.3%)   23 (19.7%)     16 (13.0%)  
              3                               15 (13.3%)   21 (17.9%)     13 (10.6%)  
              4                               16 (14.2%)    9 (7.7%)      17 (13.8%)  
      1                                           6            6              4       
              Not Low                         3 (50.0%)    5 (83.3%)      3 (75.0%)   
              1                               3 (50.0%)        0              0       
              4                                   0        1 (16.7%)      1 (25.0%)   
      2                                           8            5              1       
              Not Low                         5 (62.5%)    3 (60.0%)          0       
              1                                   0        1 (20.0%)          0       
              2                               2 (25.0%)        0              0       
              3                                   0        1 (20.0%)       1 (100%)   
              4                               1 (12.5%)        0              0       
      3                                           3            3              2       
              Not Low                             0        1 (33.3%)          0       
              1                               1 (33.3%)        0              0       
              2                               1 (33.3%)        0          1 (50.0%)   
              3                               1 (33.3%)    2 (66.7%)      1 (50.0%)   
      4                                           4            3              2       
              Not Low                          4 (100%)    1 (33.3%)      1 (50.0%)   
              1                                   0        1 (33.3%)          0       
              2                                   0        1 (33.3%)          0       
              3                                   0            0          1 (50.0%)   
C-Reactive Protein Measurement                                                        
      Not Low                                    119          113            112      
              Not Low                         41 (34.5%)   42 (37.2%)     50 (44.6%)  
              1                               20 (16.8%)   18 (15.9%)     11 (9.8%)   
              2                               24 (20.2%)   20 (17.7%)     14 (12.5%)  
              3                               25 (21.0%)   18 (15.9%)     21 (18.8%)  
              4                                9 (7.6%)    15 (13.3%)     16 (14.3%)  
      1                                           3            5              9       
              Not Low                         2 (66.7%)    2 (40.0%)      2 (22.2%)   
              2                                   0        1 (20.0%)      3 (33.3%)   
              3                               1 (33.3%)    1 (20.0%)          0       
              4                                   0        1 (20.0%)      4 (44.4%)   
      2                                           5            9              2       
              Not Low                         3 (60.0%)    4 (44.4%)      1 (50.0%)   
              1                               1 (20.0%)    4 (44.4%)          0       
              3                                   0        1 (11.1%)      1 (50.0%)   
              4                               1 (20.0%)        0              0       
      3                                           4            5              7       
              Not Low                         1 (25.0%)    4 (80.0%)      2 (28.6%)   
              1                                   0            0          1 (14.3%)   
              2                                   0            0          1 (14.3%)   
              3                               3 (75.0%)    1 (20.0%)      2 (28.6%)   
              4                                   0            0          1 (14.3%)   
      4                                           3            2              2       
              Not Low                          3 (100%)    1 (50.0%)          0       
              2                                   0        1 (50.0%)          0       
              3                                   0            0          1 (50.0%)   
              4                                   0            0          1 (50.0%)   
Immunoglobulin A Measurement                                                          
      Not Low                                    134          134            132      
              Not Low                         134 (100%)   134 (100%)     132 (100%)  
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.

Note that missing baseline values are filtered out in the pre-processing step.

  • Preview
  • Try this using WebR
Code
adlb_f <- adlb %>% filter(WGRHIFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRHIFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  filter(BTOXGR != "<Missing>") %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      ATOXGR == 1 ~ "1",
      ATOXGR == 2 ~ "2",
      ATOXGR == 3 ~ "3",
      ATOXGR == 4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      BTOXGR == 1 ~ "1",
      BTOXGR == 2 ~ "2",
      BTOXGR == 3 ~ "3",
      BTOXGR == 4 ~ "4"
    ), levels = c("Not High", "1", "2", "3", "4"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f) %>%
  prune_table()

result
Parameter                                                                             
      Baseline NCI-CTCAE Grade                A: Drug X    B: Placebo   C: Combination
              Post-baseline NCI-CTCAE Grade    (N=134)      (N=134)        (N=132)    
——————————————————————————————————————————————————————————————————————————————————————
Alanine Aminotransferase Measurement                                                  
      Not High                                   134          134            132      
              Not High                        134 (100%)   134 (100%)     132 (100%)  
C-Reactive Protein Measurement                                                        
      Not High                                   114          112            115      
              Not High                        45 (39.5%)   55 (49.1%)     57 (49.6%)  
              1                               18 (15.8%)   18 (16.1%)     19 (16.5%)  
              2                               19 (16.7%)   10 (8.9%)      11 (9.6%)   
              3                               22 (19.3%)   13 (11.6%)     20 (17.4%)  
              4                               10 (8.8%)    16 (14.3%)      8 (7.0%)   
      1                                           8            10             7       
              Not High                        5 (62.5%)    2 (20.0%)      2 (28.6%)   
              1                                   0        1 (10.0%)          0       
              2                               1 (12.5%)    3 (30.0%)      3 (42.9%)   
              3                               1 (12.5%)    1 (10.0%)          0       
              4                               1 (12.5%)    3 (30.0%)      2 (28.6%)   
      2                                           2            6              7       
              Not High                        1 (50.0%)    4 (66.7%)      4 (57.1%)   
              1                                   0        1 (16.7%)      2 (28.6%)   
              2                               1 (50.0%)    1 (16.7%)          0       
              4                                   0            0          1 (14.3%)   
      3                                           7            4              3       
              Not High                        3 (42.9%)        0          2 (66.7%)   
              1                               2 (28.6%)    1 (25.0%)      1 (33.3%)   
              2                                   0        1 (25.0%)          0       
              3                               1 (14.3%)    1 (25.0%)          0       
              4                               1 (14.3%)    1 (25.0%)          0       
      4                                           3            2              0       
              Not High                        1 (33.3%)        0              0       
              1                                   0        1 (50.0%)          0       
              3                               1 (33.3%)    1 (50.0%)          0       
              4                               1 (33.3%)        0              0       
Immunoglobulin A Measurement                                                          
      Not High                                   119          116            113      
              Not High                        55 (46.2%)   54 (46.6%)     51 (45.1%)  
              1                               18 (15.1%)   11 (9.5%)      15 (13.3%)  
              2                               14 (11.8%)   22 (19.0%)     19 (16.8%)  
              3                               20 (16.8%)   19 (16.4%)     20 (17.7%)  
              4                               12 (10.1%)   10 (8.6%)       8 (7.1%)   
      1                                           5            4              2       
              Not High                        4 (80.0%)    1 (25.0%)       2 (100%)   
              2                               1 (20.0%)    1 (25.0%)          0       
              3                                   0        2 (50.0%)          0       
      2                                           4            4              5       
              Not High                        2 (50.0%)    3 (75.0%)      3 (60.0%)   
              1                               1 (25.0%)        0          2 (40.0%)   
              3                               1 (25.0%)        0              0       
              4                                   0        1 (25.0%)          0       
      3                                           4            5              11      
              Not High                        3 (75.0%)    1 (20.0%)      6 (54.5%)   
              1                                   0        1 (20.0%)       1 (9.1%)   
              2                               1 (25.0%)        0              0       
              3                                   0        2 (40.0%)      3 (27.3%)   
              4                                   0        1 (20.0%)       1 (9.1%)   
      4                                           2            5              1       
              Not High                            0        3 (60.0%)       1 (100%)   
              2                               1 (50.0%)    1 (20.0%)          0       
              4                               1 (50.0%)    1 (20.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.

Note that when BTOXGR is missing, the grouping variable BTOXGR_GP now is "Not Low" instead of "Missing" compared to Standard Table (Low).

  • Preview
  • Try this using WebR
Code
adlb_f <- adlb %>% filter(WGRLOFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRLOFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, 1, 2, 3, 4) ~ "Not Low",
      ATOXGR == -1 ~ "1",
      ATOXGR == -2 ~ "2",
      ATOXGR == -3 ~ "3",
      ATOXGR == -4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not Low", "1", "2", "3", "4"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, 1, 2, 3, 4, "<Missing>") ~ "Not Low",
      BTOXGR == -1 ~ "1",
      BTOXGR == -2 ~ "2",
      BTOXGR == -3 ~ "3",
      BTOXGR == -4 ~ "4"
    ), levels = c("Not Low", "1", "2", "3", "4", "Missing"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f) %>%
  prune_table()

result
Parameter                                                                             
      Baseline NCI-CTCAE Grade                A: Drug X    B: Placebo   C: Combination
              Post-baseline NCI-CTCAE Grade    (N=134)      (N=134)        (N=132)    
——————————————————————————————————————————————————————————————————————————————————————
Alanine Aminotransferase Measurement                                                  
      Not Low                                    113          117            123      
              Not Low                         56 (49.6%)   55 (47.0%)     62 (50.4%)  
              1                               11 (9.7%)     9 (7.7%)      15 (12.2%)  
              2                               15 (13.3%)   23 (19.7%)     16 (13.0%)  
              3                               15 (13.3%)   21 (17.9%)     13 (10.6%)  
              4                               16 (14.2%)    9 (7.7%)      17 (13.8%)  
      1                                           6            6              4       
              Not Low                         3 (50.0%)    5 (83.3%)      3 (75.0%)   
              1                               3 (50.0%)        0              0       
              4                                   0        1 (16.7%)      1 (25.0%)   
      2                                           8            5              1       
              Not Low                         5 (62.5%)    3 (60.0%)          0       
              1                                   0        1 (20.0%)          0       
              2                               2 (25.0%)        0              0       
              3                                   0        1 (20.0%)       1 (100%)   
              4                               1 (12.5%)        0              0       
      3                                           3            3              2       
              Not Low                             0        1 (33.3%)          0       
              1                               1 (33.3%)        0              0       
              2                               1 (33.3%)        0          1 (50.0%)   
              3                               1 (33.3%)    2 (66.7%)      1 (50.0%)   
      4                                           4            3              2       
              Not Low                          4 (100%)    1 (33.3%)      1 (50.0%)   
              1                                   0        1 (33.3%)          0       
              2                                   0        1 (33.3%)          0       
              3                                   0            0          1 (50.0%)   
C-Reactive Protein Measurement                                                        
      Not Low                                    119          113            112      
              Not Low                         41 (34.5%)   42 (37.2%)     50 (44.6%)  
              1                               20 (16.8%)   18 (15.9%)     11 (9.8%)   
              2                               24 (20.2%)   20 (17.7%)     14 (12.5%)  
              3                               25 (21.0%)   18 (15.9%)     21 (18.8%)  
              4                                9 (7.6%)    15 (13.3%)     16 (14.3%)  
      1                                           3            5              9       
              Not Low                         2 (66.7%)    2 (40.0%)      2 (22.2%)   
              2                                   0        1 (20.0%)      3 (33.3%)   
              3                               1 (33.3%)    1 (20.0%)          0       
              4                                   0        1 (20.0%)      4 (44.4%)   
      2                                           5            9              2       
              Not Low                         3 (60.0%)    4 (44.4%)      1 (50.0%)   
              1                               1 (20.0%)    4 (44.4%)          0       
              3                                   0        1 (11.1%)      1 (50.0%)   
              4                               1 (20.0%)        0              0       
      3                                           4            5              7       
              Not Low                         1 (25.0%)    4 (80.0%)      2 (28.6%)   
              1                                   0            0          1 (14.3%)   
              2                                   0            0          1 (14.3%)   
              3                               3 (75.0%)    1 (20.0%)      2 (28.6%)   
              4                                   0            0          1 (14.3%)   
      4                                           3            2              2       
              Not Low                          3 (100%)    1 (50.0%)          0       
              2                                   0        1 (50.0%)          0       
              3                                   0            0          1 (50.0%)   
              4                                   0            0          1 (50.0%)   
Immunoglobulin A Measurement                                                          
      Not Low                                    134          134            132      
              Not Low                         134 (100%)   134 (100%)     132 (100%)  
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.

Pre-processing is the same as Standard Table (High), but in order to keep all levels, prune_table() is not applied.

  • Preview
  • Try this using WebR
Code
adlb_f <- adlb %>% filter(WGRHIFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRHIFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      ATOXGR == 1 ~ "1",
      ATOXGR == 2 ~ "2",
      ATOXGR == 3 ~ "3",
      ATOXGR == 4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      BTOXGR == 1 ~ "1",
      BTOXGR == 2 ~ "2",
      BTOXGR == 3 ~ "3",
      BTOXGR == 4 ~ "4",
      BTOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f)

result
Parameter                                                                             
      Baseline NCI-CTCAE Grade                A: Drug X    B: Placebo   C: Combination
              Post-baseline NCI-CTCAE Grade    (N=134)      (N=134)        (N=132)    
——————————————————————————————————————————————————————————————————————————————————————
Alanine Aminotransferase Measurement                                                  
      Not High                                   134          134            132      
              Not High                        134 (100%)   134 (100%)     132 (100%)  
              1                                   0            0              0       
              2                                   0            0              0       
              3                                   0            0              0       
              4                                   0            0              0       
              Missing                             0            0              0       
      1                                           0            0              0       
              Not High                            0            0              0       
              1                                   0            0              0       
              2                                   0            0              0       
              3                                   0            0              0       
              4                                   0            0              0       
              Missing                             0            0              0       
      2                                           0            0              0       
              Not High                            0            0              0       
              1                                   0            0              0       
              2                                   0            0              0       
              3                                   0            0              0       
              4                                   0            0              0       
              Missing                             0            0              0       
      3                                           0            0              0       
              Not High                            0            0              0       
              1                                   0            0              0       
              2                                   0            0              0       
              3                                   0            0              0       
              4                                   0            0              0       
              Missing                             0            0              0       
      4                                           0            0              0       
              Not High                            0            0              0       
              1                                   0            0              0       
              2                                   0            0              0       
              3                                   0            0              0       
              4                                   0            0              0       
              Missing                             0            0              0       
      Missing                                     0            0              0       
              Not High                            0            0              0       
              1                                   0            0              0       
              2                                   0            0              0       
              3                                   0            0              0       
              4                                   0            0              0       
              Missing                             0            0              0       
C-Reactive Protein Measurement                                                        
      Not High                                   114          112            115      
              Not High                        45 (39.5%)   55 (49.1%)     57 (49.6%)  
              1                               18 (15.8%)   18 (16.1%)     19 (16.5%)  
              2                               19 (16.7%)   10 (8.9%)      11 (9.6%)   
              3                               22 (19.3%)   13 (11.6%)     20 (17.4%)  
              4                               10 (8.8%)    16 (14.3%)      8 (7.0%)   
              Missing                             0            0              0       
      1                                           8            10             7       
              Not High                        5 (62.5%)    2 (20.0%)      2 (28.6%)   
              1                                   0        1 (10.0%)          0       
              2                               1 (12.5%)    3 (30.0%)      3 (42.9%)   
              3                               1 (12.5%)    1 (10.0%)          0       
              4                               1 (12.5%)    3 (30.0%)      2 (28.6%)   
              Missing                             0            0              0       
      2                                           2            6              7       
              Not High                        1 (50.0%)    4 (66.7%)      4 (57.1%)   
              1                                   0        1 (16.7%)      2 (28.6%)   
              2                               1 (50.0%)    1 (16.7%)          0       
              3                                   0            0              0       
              4                                   0            0          1 (14.3%)   
              Missing                             0            0              0       
      3                                           7            4              3       
              Not High                        3 (42.9%)        0          2 (66.7%)   
              1                               2 (28.6%)    1 (25.0%)      1 (33.3%)   
              2                                   0        1 (25.0%)          0       
              3                               1 (14.3%)    1 (25.0%)          0       
              4                               1 (14.3%)    1 (25.0%)          0       
              Missing                             0            0              0       
      4                                           3            2              0       
              Not High                        1 (33.3%)        0              0       
              1                                   0        1 (50.0%)          0       
              2                                   0            0              0       
              3                               1 (33.3%)    1 (50.0%)          0       
              4                               1 (33.3%)        0              0       
              Missing                             0            0              0       
      Missing                                     0            0              0       
              Not High                            0            0              0       
              1                                   0            0              0       
              2                                   0            0              0       
              3                                   0            0              0       
              4                                   0            0              0       
              Missing                             0            0              0       
Immunoglobulin A Measurement                                                          
      Not High                                   119          116            113      
              Not High                        55 (46.2%)   54 (46.6%)     51 (45.1%)  
              1                               18 (15.1%)   11 (9.5%)      15 (13.3%)  
              2                               14 (11.8%)   22 (19.0%)     19 (16.8%)  
              3                               20 (16.8%)   19 (16.4%)     20 (17.7%)  
              4                               12 (10.1%)   10 (8.6%)       8 (7.1%)   
              Missing                             0            0              0       
      1                                           5            4              2       
              Not High                        4 (80.0%)    1 (25.0%)       2 (100%)   
              1                                   0            0              0       
              2                               1 (20.0%)    1 (25.0%)          0       
              3                                   0        2 (50.0%)          0       
              4                                   0            0              0       
              Missing                             0            0              0       
      2                                           4            4              5       
              Not High                        2 (50.0%)    3 (75.0%)      3 (60.0%)   
              1                               1 (25.0%)        0          2 (40.0%)   
              2                                   0            0              0       
              3                               1 (25.0%)        0              0       
              4                                   0        1 (25.0%)          0       
              Missing                             0            0              0       
      3                                           4            5              11      
              Not High                        3 (75.0%)    1 (20.0%)      6 (54.5%)   
              1                                   0        1 (20.0%)       1 (9.1%)   
              2                               1 (25.0%)        0              0       
              3                                   0        2 (40.0%)      3 (27.3%)   
              4                                   0        1 (20.0%)       1 (9.1%)   
              Missing                             0            0              0       
      4                                           2            5              1       
              Not High                            0        3 (60.0%)       1 (100%)   
              1                                   0            0              0       
              2                               1 (50.0%)    1 (20.0%)          0       
              3                                   0            0              0       
              4                               1 (50.0%)    1 (20.0%)          0       
              Missing                             0            0              0       
      Missing                                     0            0              0       
              Not High                            0            0              0       
              1                                   0            0              0       
              2                                   0            0              0       
              3                                   0            0              0       
              4                                   0            0              0       
              Missing                             0            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.

Please note that for each variant, the adlb dataset needs to be filtered on correct flags like WGRLOFL, WGRHIFL, et al., otherwise the layout function will not return the correct counts. There is an option to create a record for a lab test where no record is found at that visit. If you specified add_derived_type = "PHANTOM" & dtype_phantom_cond, you don’t have to use the h_adsl_adlb_merge_using_worst_flag function to preprocess your adlb dataset. Otherwise please follow the pre-processing steps below before applying the layout functions.

Code
library(dplyr)
library(tern)

adsl <- random.cdisc.data::cadsl
adlb <- random.cdisc.data::cadlb

adsl <- df_explicit_na(adsl)
adlb <- df_explicit_na(adlb)

# Please note that in real clinical data, population flag like SAFFL, and parameter category like PARCAT2 needs to be
# selected properly.
adsl_f <- adsl %>% filter(SAFFL == "Y")
adlb <- adlb %>% filter(SAFFL == "Y")

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
  ADLB <- random.cdisc.data::cadlb
})
datanames <- c("ADSL", "ADLB")
datanames(data) <- datanames
Warning: `datanames<-()` was deprecated in teal.data 0.7.0.
ℹ invalid to use `datanames()<-` or `names()<-` on an object of class
  `teal_data`. See ?names.teal_data
Code
join_keys(data) <- default_cdisc_join_keys[datanames]

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

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_shift_by_grade(
      label = "Grade Laboratory Abnormality Table",
      dataname = "ADLB",
      arm_var = choices_selected(
        choices = variable_choices(ADSL, subset = c("ARM", "ARMCD")),
        selected = "ARM"
      ),
      paramcd = choices_selected(
        choices = value_choices(ADLB, "PARAMCD", "PARAM"),
        selected = "ALT"
      ),
      worst_flag_var = choices_selected(
        choices = variable_choices(ADLB, subset = c("WGRLOVFL", "WGRLOFL", "WGRHIVFL", "WGRHIFL")),
        selected = c("WGRHIFL")
      ),
      worst_flag_indicator = choices_selected(
        value_choices(ADLB, "WGRLOVFL"),
        selected = "Y", fixed = TRUE
      ),
      anl_toxgrade_var = choices_selected(
        choices = variable_choices(ADLB, subset = c("ATOXGR")),
        selected = c("ATOXGR"),
        fixed = TRUE
      ),
      base_toxgrade_var = choices_selected(
        choices = variable_choices(ADLB, subset = c("BTOXGR")),
        selected = c("BTOXGR"),
        fixed = TRUE
      ),
      add_total = FALSE
    )
  ),
  filter = teal_slices(teal_slice("ADSL", "SAFFL", selected = "Y"))
)

shinyApp(app$ui, app$server)

Experimental 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://insightsengineering.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
  ADLB <- random.cdisc.data::cadlb
})
datanames <- c("ADSL", "ADLB")
datanames(data) <- datanames
join_keys(data) <- default_cdisc_join_keys[datanames]

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

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_shift_by_grade(
      label = "Grade Laboratory Abnormality Table",
      dataname = "ADLB",
      arm_var = choices_selected(
        choices = variable_choices(ADSL, subset = c("ARM", "ARMCD")),
        selected = "ARM"
      ),
      paramcd = choices_selected(
        choices = value_choices(ADLB, "PARAMCD", "PARAM"),
        selected = "ALT"
      ),
      worst_flag_var = choices_selected(
        choices = variable_choices(ADLB, subset = c("WGRLOVFL", "WGRLOFL", "WGRHIVFL", "WGRHIFL")),
        selected = c("WGRHIFL")
      ),
      worst_flag_indicator = choices_selected(
        value_choices(ADLB, "WGRLOVFL"),
        selected = "Y", fixed = TRUE
      ),
      anl_toxgrade_var = choices_selected(
        choices = variable_choices(ADLB, subset = c("ATOXGR")),
        selected = c("ATOXGR"),
        fixed = TRUE
      ),
      base_toxgrade_var = choices_selected(
        choices = variable_choices(ADLB, subset = c("BTOXGR")),
        selected = c("BTOXGR"),
        fixed = TRUE
      ),
      add_total = FALSE
    )
  ),
  filter = teal_slices(teal_slice("ADSL", "SAFFL", selected = "Y"))
)

shinyApp(app$ui, app$server)

Reproducibility

Timestamp

[1] "2025-07-05 17:44:50 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
 bslib                   0.9.0    2025-01-30 [1] RSPM
 cachem                  1.1.0    2024-05-16 [1] RSPM
 callr                   3.7.6    2024-03-25 [1] RSPM
 checkmate               2.3.2    2024-07-29 [1] RSPM
 chromote                0.5.1    2025-04-24 [1] RSPM
 cli                     3.6.5    2025-04-23 [1] RSPM
 coda                    0.19-4.1 2024-01-31 [1] CRAN (R 4.5.0)
 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
 emmeans                 1.11.1   2025-05-04 [1] RSPM
 estimability            1.5.1    2024-05-12 [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
 fontawesome             0.5.3    2024-11-16 [1] RSPM
 forcats                 1.0.0    2023-01-29 [1] RSPM
 formatR                 1.14     2023-01-17 [1] CRAN (R 4.5.0)
 formatters            * 0.5.11   2025-04-09 [1] RSPM
 geepack                 1.3.12   2024-09-23 [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
 httpuv                  1.6.16   2025-04-16 [1] RSPM
 jquerylib               0.1.4    2021-04-26 [1] RSPM
 jsonlite                2.0.0    2025-03-27 [1] RSPM
 knitr                   1.50     2025-03-16 [1] RSPM
 later                   1.4.2    2025-04-08 [1] RSPM
 lattice                 0.22-7   2025-04-02 [2] CRAN (R 4.5.0)
 lifecycle               1.0.4    2023-11-07 [1] RSPM
 logger                  0.4.0    2024-10-22 [1] RSPM
 magrittr              * 2.0.3    2022-03-30 [1] RSPM
 MASS                    7.3-65   2025-02-28 [2] CRAN (R 4.5.0)
 Matrix                  1.7-3    2025-03-11 [1] CRAN (R 4.5.0)
 memoise                 2.0.1    2021-11-26 [1] RSPM
 mime                    0.13     2025-03-17 [1] RSPM
 multcomp                1.4-28   2025-01-29 [1] RSPM
 mvtnorm                 1.3-3    2025-01-10 [1] RSPM
 nestcolor               0.1.3    2025-01-21 [1] RSPM
 nlme                    3.1-168  2025-03-31 [2] CRAN (R 4.5.0)
 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
 promises                1.3.3    2025-05-29 [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
 Rcpp                    1.1.0    2025-07-02 [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
 sandwich                3.1-1    2024-09-15 [1] RSPM
 sass                    0.4.10   2025-04-11 [1] RSPM
 scales                  1.4.0    2025-04-24 [1] RSPM
 sessioninfo             1.2.3    2025-02-05 [1] any (@1.2.3)
 shiny                 * 1.11.1   2025-07-03 [1] RSPM
 shinycssloaders         1.1.0    2024-07-30 [1] RSPM
 shinyjs                 2.1.0    2021-12-23 [1] RSPM
 shinyvalidate           0.1.3    2023-10-04 [1] RSPM
 shinyWidgets            0.9.0    2025-02-21 [1] RSPM
 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)
 teal                  * 0.16.0   2025-02-23 [1] RSPM
 teal.code             * 0.6.1    2025-02-14 [1] RSPM
 teal.data             * 0.7.0    2025-01-28 [1] RSPM
 teal.logger             0.3.2    2025-02-14 [1] RSPM
 teal.modules.clinical * 0.10.0   2025-02-28 [1] RSPM
 teal.reporter           0.4.0    2025-01-24 [1] RSPM
 teal.slice            * 0.6.0    2025-02-03 [1] RSPM
 teal.transform        * 0.6.0    2025-02-12 [1] RSPM
 teal.widgets            0.4.3    2025-01-31 [1] RSPM
 tern                  * 0.9.9    2025-06-20 [1] RSPM
 tern.gee                0.1.5    2024-08-23 [1] RSPM
 testthat                3.2.3    2025-01-13 [1] RSPM
 TH.data                 1.1-3    2025-01-17 [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
 webshot                 0.5.5    2023-06-26 [1] CRAN (R 4.5.0)
 webshot2                0.1.2    2025-04-23 [1] RSPM
 websocket               1.4.4    2025-04-10 [1] RSPM
 withr                   3.0.2    2024-10-28 [1] RSPM
 xfun                    0.52     2025-04-02 [1] RSPM
 xtable                  1.8-4    2019-04-21 [1] RSPM
 yaml                    2.3.10   2024-07-26 [1] RSPM
 zoo                     1.8-14   2025-04-10 [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

LBT13
LBT15
Source Code
---
title: LBT14
subtitle: Laboratory Test Results Shift Table -- Highest NCI CTCAE Grade Post-Baseline by Baseline NCI CTCAE Grade
---

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

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

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

adsl <- random.cdisc.data::cadsl
adlb <- random.cdisc.data::cadlb

adsl <- df_explicit_na(adsl)
adlb <- df_explicit_na(adlb)

# Please note that in real clinical data, population flag like SAFFL, and parameter category like PARCAT2 needs to be
# selected properly.
adsl_f <- adsl %>% filter(SAFFL == "Y")
adlb <- adlb %>% filter(SAFFL == "Y")
```

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

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

## Output

:::::::: panel-tabset
## Standard Table (High)

Note that the worst laboratory flag (below `WGRHIFL`) must be selected appropriately in the pre-processing step. New grouping variables `ATOXGR_GP` (post-baseline) and `BTOXGR_GP` (baseline) are created to display the correct output.

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

```{r variant1, test = list(result_v1 = "result")}
adlb_f <- adlb %>% filter(WGRHIFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRHIFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      ATOXGR == 1 ~ "1",
      ATOXGR == 2 ~ "2",
      ATOXGR == 3 ~ "3",
      ATOXGR == 4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      BTOXGR == 1 ~ "1",
      BTOXGR == 2 ~ "2",
      BTOXGR == 3 ~ "3",
      BTOXGR == 4 ~ "4",
      BTOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f) %>%
  prune_table()

result
```

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

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

## Standard Table (Low)

Note that the worst laboratory flag (below `WGRLOFL`) must be selected appropriately in the pre-processing step. New grouping variables `ATOXGR_GP` (post-baseline) and `BTOXGR_GP` (baseline) are created to display the correct output.

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

```{r variant2, test = list(result_v2 = "result")}
adlb_f <- adlb %>% filter(WGRLOFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRLOFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, 1, 2, 3, 4) ~ "Not Low",
      ATOXGR == -1 ~ "1",
      ATOXGR == -2 ~ "2",
      ATOXGR == -3 ~ "3",
      ATOXGR == -4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not Low", "1", "2", "3", "4", "Missing"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, 1, 2, 3, 4) ~ "Not Low",
      BTOXGR == -1 ~ "1",
      BTOXGR == -2 ~ "2",
      BTOXGR == -3 ~ "3",
      BTOXGR == -4 ~ "4",
      BTOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not Low", "1", "2", "3", "4", "Missing"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f) %>%
  prune_table()

result
```

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

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

## Table Without Patients with <br/> Missing Baseline (High)

Note that missing baseline values are filtered out in the pre-processing step.

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

```{r variant3, test = list(result_v3 = "result")}
adlb_f <- adlb %>% filter(WGRHIFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRHIFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  filter(BTOXGR != "<Missing>") %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      ATOXGR == 1 ~ "1",
      ATOXGR == 2 ~ "2",
      ATOXGR == 3 ~ "3",
      ATOXGR == 4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      BTOXGR == 1 ~ "1",
      BTOXGR == 2 ~ "2",
      BTOXGR == 3 ~ "3",
      BTOXGR == 4 ~ "4"
    ), levels = c("Not High", "1", "2", "3", "4"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f) %>%
  prune_table()

result
```

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

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

## Table with Missing Baseline <br/> Considered as Grade 0 (Low)

Note that when BTOXGR is missing, the grouping variable `BTOXGR_GP` now is `"Not Low"` instead of `"Missing"` compared to *Standard Table (Low)*.

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

```{r variant4, test = list(result_v4 = "result")}
adlb_f <- adlb %>% filter(WGRLOFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRLOFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, 1, 2, 3, 4) ~ "Not Low",
      ATOXGR == -1 ~ "1",
      ATOXGR == -2 ~ "2",
      ATOXGR == -3 ~ "3",
      ATOXGR == -4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not Low", "1", "2", "3", "4"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, 1, 2, 3, 4, "<Missing>") ~ "Not Low",
      BTOXGR == -1 ~ "1",
      BTOXGR == -2 ~ "2",
      BTOXGR == -3 ~ "3",
      BTOXGR == -4 ~ "4"
    ), levels = c("Not Low", "1", "2", "3", "4", "Missing"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f) %>%
  prune_table()

result
```

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

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

## Table with Fill-In of Grades

Pre-processing is the same as *Standard Table (High)*, but in order to keep all levels, `prune_table()` is not applied.

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

```{r variant5, test = list(result_v5 = "result")}
adlb_f <- adlb %>% filter(WGRHIFL == "Y")

# Please note the step below can be skipped if you are using DTYPE PHANTOM
adlb_out <- h_adsl_adlb_merge_using_worst_flag(adsl_f, adlb_f, worst_flag = c("WGRHIFL" = "Y"))

# Create new grouping variables ATOXGR_GP, BTOXGR_GP
adlb_out <- adlb_out %>%
  mutate(
    ATOXGR_GP = factor(case_when(
      ATOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      ATOXGR == 1 ~ "1",
      ATOXGR == 2 ~ "2",
      ATOXGR == 3 ~ "3",
      ATOXGR == 4 ~ "4",
      ATOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  ) %>%
  mutate(
    BTOXGR_GP = factor(case_when(
      BTOXGR %in% c(0, -1, -2, -3, -4) ~ "Not High",
      BTOXGR == 1 ~ "1",
      BTOXGR == 2 ~ "2",
      BTOXGR == 3 ~ "3",
      BTOXGR == 4 ~ "4",
      BTOXGR == "<Missing>" ~ "Missing"
    ), levels = c("Not High", "1", "2", "3", "4", "Missing"))
  )

result <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  split_rows_by(
    "PARAM",
    split_fun = drop_split_levels,
    label_pos = "topleft",
    split_label = "Parameter"
  ) %>%
  split_rows_by(
    "BTOXGR_GP",
    label_pos = "topleft",
    split_label = "    Baseline NCI-CTCAE Grade",
    indent_mod = 2L
  ) %>%
  summarize_num_patients(var = "USUBJID", .stats = c("unique_count"), unique_count_suffix = FALSE) %>%
  count_occurrences_by_grade("ATOXGR_GP", denom = "n", drop = FALSE, .indent_mods = 3L) %>%
  append_topleft("              Post-baseline NCI-CTCAE Grade") %>%
  build_table(df = adlb_out, alt_counts_df = adsl_f)

result
```

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

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

## Data Setup

Please note that for each variant, the `adlb` dataset needs to be filtered on correct flags like `WGRLOFL`, `WGRHIFL`, et al., otherwise the layout function will not return the correct counts. There is an option to create a record for a lab test where no record is found at that visit. If you specified `add_derived_type = "PHANTOM"` & `dtype_phantom_cond`, you don't have to use the `h_adsl_adlb_merge_using_worst_flag` function to preprocess your `adlb` dataset. Otherwise please follow the pre-processing steps below before applying the layout functions.

```{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
  ADLB <- random.cdisc.data::cadlb
})
datanames <- c("ADSL", "ADLB")
datanames(data) <- datanames
join_keys(data) <- default_cdisc_join_keys[datanames]

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

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_shift_by_grade(
      label = "Grade Laboratory Abnormality Table",
      dataname = "ADLB",
      arm_var = choices_selected(
        choices = variable_choices(ADSL, subset = c("ARM", "ARMCD")),
        selected = "ARM"
      ),
      paramcd = choices_selected(
        choices = value_choices(ADLB, "PARAMCD", "PARAM"),
        selected = "ALT"
      ),
      worst_flag_var = choices_selected(
        choices = variable_choices(ADLB, subset = c("WGRLOVFL", "WGRLOFL", "WGRHIVFL", "WGRHIFL")),
        selected = c("WGRHIFL")
      ),
      worst_flag_indicator = choices_selected(
        value_choices(ADLB, "WGRLOVFL"),
        selected = "Y", fixed = TRUE
      ),
      anl_toxgrade_var = choices_selected(
        choices = variable_choices(ADLB, subset = c("ATOXGR")),
        selected = c("ATOXGR"),
        fixed = TRUE
      ),
      base_toxgrade_var = choices_selected(
        choices = variable_choices(ADLB, subset = c("BTOXGR")),
        selected = c("BTOXGR"),
        fixed = TRUE
      ),
      add_total = FALSE
    )
  ),
  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