TLG Catalog - Stable
  • Stable
    • Dev
  1. Tables
  2. Adverse Events
  3. AET04_PI
  • 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. Adverse Events
  3. AET04_PI

AET04_PI

Adverse Events Reported in \(\geq\) 10% of Patients by Highest NCI CTCAE Grade


Output

  • Standard Table
  • Table with Patients Treated with a Particular Treatment by Highest NCI
    CTCAE Grade (specifying a treatment for selecting preferred terms)
  • Adverse Events Reported in \(\geq\) 5% of Patients by
    Highest NCI CTCAE Grade (changing the threshold)
  • Adverse Events Reported in \(\geq\) 5% of Patients and
    \(\geq\) 2% Difference Between Treatments by Highest
    NCI CTCAE Grade (using more than one condition)
  • Adverse Events Reported in \(\geq\) 10% of Patients for Any Grade
    or \(\geq\) 5% of Patients for Grade 3-4 by Highest NCI CTCAE
    Grade (using different condition depending on the grade)
  • Standard Table with
    Modified Grade Grouping
  • Standard Table with
    Overlapping Grade Groupings
  • Standard Table without SOCs
  • Data Setup
  • Preview
  • Try this using WebR
Code
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_10percent_any <- has_fraction_in_any_col(atleast = 0.1, col_indices = c(1, 4, 7))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_10percent_any))

result
                                             A: Drug X                                    B: Placebo                                  C: Combination               
MedDRA System Organ Class   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)
  MedDRA Preferred Term        (N=134)         (N=134)        (N=134)        (N=134)         (N=134)        (N=134)        (N=132)         (N=132)        (N=132)  
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
cl A.1                                                                                                                                                             
dcd A.1.1.1.1                    37               0              0             34               0              0             48               0              0     
dcd A.1.1.1.2                    36               0              0             36               0              0             38               0              0     
cl B.2                                                                                                                                                             
dcd B.2.2.3.1                    36               0              0             40               0              0             39               0              0     
dcd B.2.1.2.1                    37              37              0             33              33              0             39              39              0     
cl D.1                                                                                                                                                             
dcd D.1.1.1.1                    37               0             37             31               0             31             39               0             39     
dcd D.1.1.4.2                    36              36              0             31              31              0             38              38              0     
cl D.2                                                                                                                                                             
dcd D.2.1.5.3                    35               0              0             43               0              0             43               0              0     
cl B.1                                                                                                                                                             
dcd B.1.1.1.1                    35               0             35             37               0             37             33               0             33     
cl C.2                                                                                                                                                             
dcd C.2.1.2.1                    26               0              0             36               0              0             42               0              0     
cl C.1                                                                                                                                                             
dcd C.1.1.1.3                    32              32              0             34              34              0             33              33              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: User needs to specify the column index for filtering the table. The current example uses the “Any Grade” column for treatment A: Drug X with a filtering threshold at 0.37; AEs reported in greater than 37% of patients in treatment A: Drug X are shown. This can be changed by varying the parameter values in the has_fraction_in_cols function.

  • Preview
  • Try this using WebR
Code
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_37percent_any_drugx <- has_fraction_in_cols(atleast = 0.37, col_indices = 1)

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_37percent_any_drugx))

result
                                             A: Drug X                                    B: Placebo                                  C: Combination               
MedDRA System Organ Class   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)
  MedDRA Preferred Term        (N=134)         (N=134)        (N=134)        (N=134)         (N=134)        (N=134)        (N=132)         (N=132)        (N=132)  
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
cl A.1                                                                                                                                                             
dcd A.1.1.1.1                    37               0              0             34               0              0             48               0              0     
cl D.1                                                                                                                                                             
dcd D.1.1.1.1                    37               0             37             31               0             31             39               0             39     
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: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.40 to demonstrate the filtering ability; AEs reported in greater than 40% of patients are shown. This can be changed by varying the parameter values in the has_fraction_in_any_col function.

  • Preview
  • Try this using WebR
Code
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_40percent_any <- has_fraction_in_any_col(atleast = 0.40, col_indices = c(1, 4, 7))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_40percent_any))

result
                                             A: Drug X                                    B: Placebo                                  C: Combination               
MedDRA System Organ Class   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)
  MedDRA Preferred Term        (N=134)         (N=134)        (N=134)        (N=134)         (N=134)        (N=134)        (N=132)         (N=132)        (N=132)  
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
cl A.1                                                                                                                                                             
dcd A.1.1.1.1                    37               0              0             34               0              0             48               0              0     
cl B.2                                                                                                                                                             
dcd B.2.2.3.1                    36               0              0             40               0              0             39               0              0     
cl D.2                                                                                                                                                             
dcd D.2.1.5.3                    35               0              0             43               0              0             43               0              0     
cl C.2                                                                                                                                                             
dcd C.2.1.2.1                    26               0              0             36               0              0             42               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: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 to filter for AEs reported in \(\geq\) 30% of patients and AEs reported with a \(\geq\) 15% difference between treatments to demonstrate the filtering ability; this can be changed by varying the parameter values in the has_fraction_in_any_col and has_fractions_difference functions.

  • Preview
  • Try this using WebR
Code
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_30percent_any <- has_fraction_in_any_col(atleast = 0.3, col_indices = c(1, 4, 7))

at_least_15percent_diff <- has_fractions_difference(atleast = 0.15, col_indices = c(1, 4, 7))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_30percent_any & at_least_15percent_diff))

result
                                             A: Drug X                                    B: Placebo                                  C: Combination               
MedDRA System Organ Class   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)
  MedDRA Preferred Term        (N=134)         (N=134)        (N=134)        (N=134)         (N=134)        (N=134)        (N=132)         (N=132)        (N=132)  
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
cl C.2                                                                                                                                                             
dcd C.2.1.2.1                    26               0              0             36               0              0             42               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: User needs to specify the column index for filtering the table. The current example filters using column indices 1, 4, and 7 to include AEs reported in \(\geq\) 40% of patients and using column indices 2, 5, and 8 to include grade 3-4 AEs reported in \(\geq\) 20% of patients. These thresholds are chosen to demonstrate the filtering ability; they can be changed by varying parameter values in the has_fraction_in_any_col function.

  • Preview
  • Try this using WebR
Code
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 4, 7))

at_least_20percent_g34 <- has_fraction_in_any_col(atleast = 0.20, col_indices = c(2, 5, 8))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_40percent_any | at_least_20percent_g34))

result
                                             A: Drug X                                    B: Placebo                                  C: Combination               
MedDRA System Organ Class   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)
  MedDRA Preferred Term        (N=134)         (N=134)        (N=134)        (N=134)         (N=134)        (N=134)        (N=132)         (N=132)        (N=132)  
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
cl A.1                                                                                                                                                             
dcd A.1.1.1.1                    37               0              0             34               0              0             48               0              0     
cl B.2                                                                                                                                                             
dcd B.2.2.3.1                    36               0              0             40               0              0             39               0              0     
dcd B.2.1.2.1                    37              37              0             33              33              0             39              39              0     
cl D.1                                                                                                                                                             
dcd D.1.1.4.2                    36              36              0             31              31              0             38              38              0     
cl D.2                                                                                                                                                             
dcd D.2.1.5.3                    35               0              0             43               0              0             43               0              0     
cl C.2                                                                                                                                                             
dcd C.2.1.2.1                    26               0              0             36               0              0             42               0              0     
cl C.1                                                                                                                                                             
dcd C.1.1.1.3                    32              32              0             34              34              0             33              33              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: User can specify/modify the grouping of grades, as shown in this example. In addition, the user needs to specify the column index for filtering the table. The current example uses the “Any Grade” columns with a filtering threshold at 0.40; this can be changed by varying the parameter values in the has_fraction_in_any_col function.

  • Preview
  • Try this using WebR
Code
grade_groups <- list(
  "Any Grade (%)" = c("1", "2", "3", "4", "5"),
  "Grade 1-2 (%)" = c("1", "2"),
  "Grade 3-4 (%)" = c("3", "4"),
  "Grade 5 (%)" = "5"
)

col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))

full_table <- basic_table() %>%
  split_cols_by("ACTARM") %>%
  split_cols_by_groups("MAXAETOXGR", groups_list = grade_groups) %>%
  split_rows_by("AEBODSYS",
    child_labels = "visible", nested = FALSE, indent_mod = -1L,
    split_fun = trim_levels_in_group("AEDECOD")
  ) %>%
  append_topleft("MedDRA System Organ Class") %>%
  summarize_num_patients(
    var = "USUBJID",
    .stats = "unique",
    .labels = "Total number of patients with at least one adverse event"
  ) %>%
  analyze_vars(
    "AEDECOD",
    na.rm = FALSE,
    denom = "N_col",
    .stats = "count_fraction",
    .formats = c(count_fraction = format_fraction_threshold(0.01))
  ) %>%
  append_topleft("  MedDRA Preferred Term") %>%
  build_table(adae_max, col_counts = col_counts) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 5, 9)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 5, 9)),
    decreasing = TRUE
  )

at_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 5, 9))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_40percent_any))

result
                                                     A: Drug X                                                    B: Placebo                                                  C: Combination                       
MedDRA System Organ Class   Any Grade (%)   Grade 1-2 (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 1-2 (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 1-2 (%)   Grade 3-4 (%)   Grade 5 (%)
  MedDRA Preferred Term        (N=134)         (N=134)         (N=134)        (N=134)        (N=134)         (N=134)         (N=134)        (N=134)        (N=132)         (N=132)         (N=132)        (N=132)  
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
cl A.1                                                                                                                                                                                                             
dcd A.1.1.1.1                    37              37               0              0             34              34               0              0             48              48               0              0     
cl B.2                                                                                                                                                                                                             
dcd B.2.2.3.1                    36              36               0              0             40              40               0              0             39              39               0              0     
cl D.2                                                                                                                                                                                                             
dcd D.2.1.5.3                    35              35               0              0             43              43               0              0             43              43               0              0     
cl C.2                                                                                                                                                                                                             
dcd C.2.1.2.1                    26              26               0              0             36              36               0              0             42              42               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: User needs to specify the column index for filtering the table. The current example uses column indices 1, 5, and 9 with a filtering threshold at 0.40 to demonstrate the filtering ability; any grade AEs reported in greater than 40% of patients are shown. This can be changed by varying the parameter values in the has_fraction_in_any_col function.

  • Preview
  • Try this using WebR
Code
grade_groups <- list(
  "Any Grade (%)" = c("1", "2", "3", "4", "5"),
  "Grade 3-4 (%)" = c("3", "4"),
  "Grade 3-5 (%)" = c("3", "4", "5"),
  "Grade 5 (%)" = "5"
)

col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))
full_table <- basic_table() %>%
  split_cols_by("ACTARM") %>%
  split_cols_by_groups("MAXAETOXGR", groups_list = grade_groups) %>%
  split_rows_by("AEBODSYS",
    child_labels = "visible", nested = FALSE, indent_mod = -1L,
    split_fun = trim_levels_in_group("AEDECOD")
  ) %>%
  append_topleft("MedDRA System Organ Class") %>%
  summarize_num_patients(
    var = "USUBJID",
    .stats = "unique",
    .labels = "Total number of patients with at least one adverse event"
  ) %>%
  analyze_vars(
    "AEDECOD",
    na.rm = FALSE,
    denom = "N_col",
    .stats = "count_fraction",
    .formats = c(count_fraction = format_fraction_threshold(0.01))
  ) %>%
  append_topleft("  MedDRA Preferred Term") %>%
  build_table(adae_max, col_counts = col_counts) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 5, 9)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 5, 9)),
    decreasing = TRUE
  )

at_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 5, 9))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_40percent_any))

result
                                                     A: Drug X                                                    B: Placebo                                                  C: Combination                       
MedDRA System Organ Class   Any Grade (%)   Grade 3-4 (%)   Grade 3-5 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 3-5 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 3-5 (%)   Grade 5 (%)
  MedDRA Preferred Term        (N=134)         (N=134)         (N=134)        (N=134)        (N=134)         (N=134)         (N=134)        (N=134)        (N=132)         (N=132)         (N=132)        (N=132)  
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
cl A.1                                                                                                                                                                                                             
dcd A.1.1.1.1                    37               0               0              0             34               0               0              0             48               0               0              0     
cl B.2                                                                                                                                                                                                             
dcd B.2.2.3.1                    36               0               0              0             40               0               0              0             39               0               0              0     
cl D.2                                                                                                                                                                                                             
dcd D.2.1.5.3                    35               0               0              0             43               0               0              0             43               0               0              0     
cl C.2                                                                                                                                                                                                             
dcd C.2.1.2.1                    26               0               0              0             36               0               0              0             42               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.

Note: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.20 to demonstrate the filtering ability; any grade AEs (Preferred Terms Only) reported in greater than 20% of patients are shown. This can be changed by varying the parameter values in the has_fraction_in_any_col function.

  • Preview
  • Try this using WebR
Code
grade_groups <- list(
  "Any Grade (%)" = c("1", "2", "3", "4", "5"),
  "Grade 3-4 (%)" = c("3", "4"),
  "Grade 5 (%)" = "5"
)

col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))

full_table <- basic_table() %>%
  split_cols_by("ACTARM") %>%
  split_cols_by_groups("MAXAETOXGR", groups_list = grade_groups) %>%
  analyze_vars(
    "AEDECOD",
    na.rm = FALSE,
    denom = "N_col",
    .stats = "count_fraction",
    .formats = c(count_fraction = format_fraction_threshold(0.01))
  ) %>%
  append_topleft("MedDRA Preferred Term") %>%
  build_table(adae_max, col_counts = col_counts)

at_least_20percent_any <- has_fraction_in_any_col(atleast = 0.2, col_indices = c(1, 4, 7))

result <- full_table %>%
  prune_table(keep_rows(at_least_20percent_any)) %>%
  sort_at_path(
    path = c("AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

result
                                         A: Drug X                                    B: Placebo                                  C: Combination               
                        Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)   Any Grade (%)   Grade 3-4 (%)   Grade 5 (%)
MedDRA Preferred Term      (N=134)         (N=134)        (N=134)        (N=134)         (N=134)        (N=134)        (N=132)         (N=132)        (N=132)  
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
dcd D.2.1.5.3                35               0              0             43               0              0             43               0              0     
dcd A.1.1.1.1                37               0              0             34               0              0             48               0              0     
dcd B.2.2.3.1                36               0              0             40               0              0             39               0              0     
dcd A.1.1.1.2                36               0              0             36               0              0             38               0              0     
dcd B.2.1.2.1                37              37              0             33              33              0             39              39              0     
dcd D.1.1.1.1                37               0             37             31               0             31             39               0             39     
dcd D.1.1.4.2                36              36              0             31              31              0             38              38              0     
dcd B.1.1.1.1                35               0             35             37               0             37             33               0             33     
dcd C.2.1.2.1                26               0              0             36               0              0             42               0              0     
dcd C.1.1.1.3                32              32              0             34              34              0             33              33              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.

Code
library(dplyr)
library(tern)

preprocess_adae <- function(adae) {
  adae %>%
    dplyr::group_by(ACTARM, USUBJID, AEBODSYS, AEDECOD) %>%
    dplyr::summarize(
      MAXAETOXGR = max(as.numeric(AETOXGR)),
      .groups = "drop"
    ) %>%
    dplyr::ungroup() %>%
    dplyr::mutate(
      MAXAETOXGR = factor(MAXAETOXGR),
      AEDECOD = droplevels(as.factor(AEDECOD))
    )
}

full_table_aet04_pi <- function(adsl, adae_max) {
  grade_groups <- list(
    "Any Grade (%)" = c("1", "2", "3", "4", "5"),
    "Grade 3-4 (%)" = c("3", "4"),
    "Grade 5 (%)" = "5"
  )

  col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))
  basic_table() %>%
    split_cols_by("ACTARM") %>%
    split_cols_by_groups("MAXAETOXGR", groups_list = grade_groups) %>%
    split_rows_by("AEBODSYS",
      child_labels = "visible", nested = FALSE, indent_mod = -1L,
      split_fun = trim_levels_in_group("AEDECOD")
    ) %>%
    append_topleft("MedDRA System Organ Class") %>%
    summarize_num_patients(
      var = "USUBJID",
      .stats = "unique",
      .labels = "Total number of patients with at least one adverse event"
    ) %>%
    analyze_vars(
      "AEDECOD",
      na.rm = FALSE,
      denom = "N_col",
      .stats = "count_fraction",
      .formats = c(count_fraction = format_fraction_threshold(0.01))
    ) %>%
    append_topleft("  MedDRA Preferred Term") %>%
    build_table(adae_max, col_counts = col_counts)
}

criteria_fun <- function(tr) {
  is(tr, "ContentRow")
}

adsl <- random.cdisc.data::cadsl
adae_max <- random.cdisc.data::cadae %>%
  preprocess_adae() %>%
  df_explicit_na()

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
  ADAE <- random.cdisc.data::cadae
})
datanames <- c("ADSL", "ADAE")
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
ADAE <- data[["ADAE"]]

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_events_by_grade(
      label = "Adverse Events by Grade Table",
      dataname = "ADAE",
      arm_var = choices_selected(c("ARM", "ARMCD"), "ARM"),
      col_by_grade = TRUE,
      llt = choices_selected(
        choices = variable_choices(ADAE, c("AETERM", "AEDECOD")),
        selected = c("AEDECOD")
      ),
      hlt = choices_selected(
        choices = variable_choices(ADAE, c("AEBODSYS", "AESOC")),
        selected = "AEBODSYS"
      ),
      grade = choices_selected(
        choices = variable_choices(ADAE, c("AETOXGR", "AESEV")),
        selected = "AETOXGR"
      ),
      # List of column groups for grades used when `col_by_grade` = TRUE.
      grading_groups = list(
        `Any Grade (%)` = c("1", "2", "3", "4", "5"),
        `Grade 3-4 (%)` = c("3", "4"),
        `Grade 5 (%)` = "5"
      )
    )
  )
)

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

## Reusable Configuration For Modules
ADAE <- data[["ADAE"]]

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_events_by_grade(
      label = "Adverse Events by Grade Table",
      dataname = "ADAE",
      arm_var = choices_selected(c("ARM", "ARMCD"), "ARM"),
      col_by_grade = TRUE,
      llt = choices_selected(
        choices = variable_choices(ADAE, c("AETERM", "AEDECOD")),
        selected = c("AEDECOD")
      ),
      hlt = choices_selected(
        choices = variable_choices(ADAE, c("AEBODSYS", "AESOC")),
        selected = "AEBODSYS"
      ),
      grade = choices_selected(
        choices = variable_choices(ADAE, c("AETOXGR", "AESEV")),
        selected = "AETOXGR"
      ),
      # List of column groups for grades used when `col_by_grade` = TRUE.
      grading_groups = list(
        `Any Grade (%)` = c("1", "2", "3", "4", "5"),
        `Grade 3-4 (%)` = c("3", "4"),
        `Grade 5 (%)` = "5"
      )
    )
  )
)

shinyApp(app$ui, app$server)

Reproducibility

Timestamp

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

AET04
AET05
Source Code
---
title: AET04_PI
subtitle: Adverse Events Reported in $\geq$ 10% of Patients by Highest NCI CTCAE Grade
---

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

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

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

preprocess_adae <- function(adae) {
  adae %>%
    dplyr::group_by(ACTARM, USUBJID, AEBODSYS, AEDECOD) %>%
    dplyr::summarize(
      MAXAETOXGR = max(as.numeric(AETOXGR)),
      .groups = "drop"
    ) %>%
    dplyr::ungroup() %>%
    dplyr::mutate(
      MAXAETOXGR = factor(MAXAETOXGR),
      AEDECOD = droplevels(as.factor(AEDECOD))
    )
}

full_table_aet04_pi <- function(adsl, adae_max) {
  grade_groups <- list(
    "Any Grade (%)" = c("1", "2", "3", "4", "5"),
    "Grade 3-4 (%)" = c("3", "4"),
    "Grade 5 (%)" = "5"
  )

  col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))
  basic_table() %>%
    split_cols_by("ACTARM") %>%
    split_cols_by_groups("MAXAETOXGR", groups_list = grade_groups) %>%
    split_rows_by("AEBODSYS",
      child_labels = "visible", nested = FALSE, indent_mod = -1L,
      split_fun = trim_levels_in_group("AEDECOD")
    ) %>%
    append_topleft("MedDRA System Organ Class") %>%
    summarize_num_patients(
      var = "USUBJID",
      .stats = "unique",
      .labels = "Total number of patients with at least one adverse event"
    ) %>%
    analyze_vars(
      "AEDECOD",
      na.rm = FALSE,
      denom = "N_col",
      .stats = "count_fraction",
      .formats = c(count_fraction = format_fraction_threshold(0.01))
    ) %>%
    append_topleft("  MedDRA Preferred Term") %>%
    build_table(adae_max, col_counts = col_counts)
}

criteria_fun <- function(tr) {
  is(tr, "ContentRow")
}

adsl <- random.cdisc.data::cadsl
adae_max <- random.cdisc.data::cadae %>%
  preprocess_adae() %>%
  df_explicit_na()
```

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

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

## Output

::::::::::: panel-tabset
## Standard Table

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

```{r variant1, test = list(result_v1 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_10percent_any <- has_fraction_in_any_col(atleast = 0.1, col_indices = c(1, 4, 7))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_10percent_any))

result
```

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

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

## Table with Patients Treated with a Particular Treatment by Highest NCI <br/> CTCAE Grade (specifying a treatment for selecting preferred terms)

Note: User needs to specify the column index for filtering the table. The current example uses the "Any Grade" column for treatment A: Drug X with a filtering threshold at 0.37; AEs reported in greater than 37% of patients in treatment A: Drug X are shown. This can be changed by varying the parameter values in the `has_fraction_in_cols` function.

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

```{r variant2, test = list(result_v2 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_37percent_any_drugx <- has_fraction_in_cols(atleast = 0.37, col_indices = 1)

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_37percent_any_drugx))

result
```

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

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

## Adverse Events Reported in $\geq$ 5% of Patients by <br/> Highest NCI CTCAE Grade (changing the threshold)

Note: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.40 to demonstrate the filtering ability; AEs reported in greater than 40% of patients are shown. This can be changed by varying the parameter values in the `has_fraction_in_any_col` function.

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

```{r variant3, test = list(result_v3 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_40percent_any <- has_fraction_in_any_col(atleast = 0.40, col_indices = c(1, 4, 7))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_40percent_any))

result
```

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

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

## Adverse Events Reported in $\geq$ 5% of Patients and <br/> $\geq$ 2% Difference Between Treatments by Highest <br/> NCI CTCAE Grade (using more than one condition)

Note: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 to filter for AEs reported in $\geq$ 30% of patients and AEs reported with a $\geq$ 15% difference between treatments to demonstrate the filtering ability; this can be changed by varying the parameter values in the `has_fraction_in_any_col` and `has_fractions_difference` functions.

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

```{r variant4, test = list(result_v4 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_30percent_any <- has_fraction_in_any_col(atleast = 0.3, col_indices = c(1, 4, 7))

at_least_15percent_diff <- has_fractions_difference(atleast = 0.15, col_indices = c(1, 4, 7))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_30percent_any & at_least_15percent_diff))

result
```

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

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

## Adverse Events Reported in $\geq$ 10% of Patients for Any Grade <br/> or $\geq$ 5% of Patients for Grade 3-4 by Highest NCI CTCAE <br/> Grade (using different condition depending on the grade)

Note: User needs to specify the column index for filtering the table. The current example filters using column indices 1, 4, and 7 to include AEs reported in $\geq$ 40% of patients and using column indices 2, 5, and 8 to include grade 3-4 AEs reported in $\geq$ 20% of patients. These thresholds are chosen to demonstrate the filtering ability; they can be changed by varying parameter values in the `has_fraction_in_any_col` function.

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

```{r variant5, test = list(result_v5 = "result")}
full_table <- full_table_aet04_pi(adsl, adae_max) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

at_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 4, 7))

at_least_20percent_g34 <- has_fraction_in_any_col(atleast = 0.20, col_indices = c(2, 5, 8))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_40percent_any | at_least_20percent_g34))

result
```

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

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

## Standard Table with <br/> Modified Grade Grouping

Note: User can specify/modify the grouping of grades, as shown in this example. In addition, the user needs to specify the column index for filtering the table. The current example uses the "Any Grade" columns with a filtering threshold at 0.40; this can be changed by varying the parameter values in the `has_fraction_in_any_col` function.

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

```{r variant6, test = list(result_v6 = "result")}
grade_groups <- list(
  "Any Grade (%)" = c("1", "2", "3", "4", "5"),
  "Grade 1-2 (%)" = c("1", "2"),
  "Grade 3-4 (%)" = c("3", "4"),
  "Grade 5 (%)" = "5"
)

col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))

full_table <- basic_table() %>%
  split_cols_by("ACTARM") %>%
  split_cols_by_groups("MAXAETOXGR", groups_list = grade_groups) %>%
  split_rows_by("AEBODSYS",
    child_labels = "visible", nested = FALSE, indent_mod = -1L,
    split_fun = trim_levels_in_group("AEDECOD")
  ) %>%
  append_topleft("MedDRA System Organ Class") %>%
  summarize_num_patients(
    var = "USUBJID",
    .stats = "unique",
    .labels = "Total number of patients with at least one adverse event"
  ) %>%
  analyze_vars(
    "AEDECOD",
    na.rm = FALSE,
    denom = "N_col",
    .stats = "count_fraction",
    .formats = c(count_fraction = format_fraction_threshold(0.01))
  ) %>%
  append_topleft("  MedDRA Preferred Term") %>%
  build_table(adae_max, col_counts = col_counts) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 5, 9)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 5, 9)),
    decreasing = TRUE
  )

at_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 5, 9))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_40percent_any))

result
```

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

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

## Standard Table with <br/> Overlapping Grade Groupings

Note: User needs to specify the column index for filtering the table. The current example uses column indices 1, 5, and 9 with a filtering threshold at 0.40 to demonstrate the filtering ability; any grade AEs reported in greater than 40% of patients are shown. This can be changed by varying the parameter values in the `has_fraction_in_any_col` function.

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

```{r variant7, test = list(result_v7 = "result")}
grade_groups <- list(
  "Any Grade (%)" = c("1", "2", "3", "4", "5"),
  "Grade 3-4 (%)" = c("3", "4"),
  "Grade 3-5 (%)" = c("3", "4", "5"),
  "Grade 5 (%)" = "5"
)

col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))
full_table <- basic_table() %>%
  split_cols_by("ACTARM") %>%
  split_cols_by_groups("MAXAETOXGR", groups_list = grade_groups) %>%
  split_rows_by("AEBODSYS",
    child_labels = "visible", nested = FALSE, indent_mod = -1L,
    split_fun = trim_levels_in_group("AEDECOD")
  ) %>%
  append_topleft("MedDRA System Organ Class") %>%
  summarize_num_patients(
    var = "USUBJID",
    .stats = "unique",
    .labels = "Total number of patients with at least one adverse event"
  ) %>%
  analyze_vars(
    "AEDECOD",
    na.rm = FALSE,
    denom = "N_col",
    .stats = "count_fraction",
    .formats = c(count_fraction = format_fraction_threshold(0.01))
  ) %>%
  append_topleft("  MedDRA Preferred Term") %>%
  build_table(adae_max, col_counts = col_counts) %>%
  sort_at_path(
    path = c("AEBODSYS"),
    scorefun = score_occurrences_cont_cols(col_indices = c(1, 5, 9)),
    decreasing = TRUE
  ) %>%
  sort_at_path(
    path = c("AEBODSYS", "*", "AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 5, 9)),
    decreasing = TRUE
  )

at_least_40percent_any <- has_fraction_in_any_col(atleast = 0.4, col_indices = c(1, 5, 9))

result <- full_table %>%
  trim_rows(criteria = criteria_fun) %>%
  prune_table(keep_rows(at_least_40percent_any))

result
```

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

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

## Standard Table without SOCs

Note: User needs to specify the column index for filtering the table. The current example uses column indices 1, 4, and 7 with a filtering threshold at 0.20 to demonstrate the filtering ability; any grade AEs (Preferred Terms Only) reported in greater than 20% of patients are shown. This can be changed by varying the parameter values in the `has_fraction_in_any_col` function.

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

```{r variant8, test = list(result_v8 = "result")}
grade_groups <- list(
  "Any Grade (%)" = c("1", "2", "3", "4", "5"),
  "Grade 3-4 (%)" = c("3", "4"),
  "Grade 5 (%)" = "5"
)

col_counts <- rep(table(adsl$ACTARM), each = length(grade_groups))

full_table <- basic_table() %>%
  split_cols_by("ACTARM") %>%
  split_cols_by_groups("MAXAETOXGR", groups_list = grade_groups) %>%
  analyze_vars(
    "AEDECOD",
    na.rm = FALSE,
    denom = "N_col",
    .stats = "count_fraction",
    .formats = c(count_fraction = format_fraction_threshold(0.01))
  ) %>%
  append_topleft("MedDRA Preferred Term") %>%
  build_table(adae_max, col_counts = col_counts)

at_least_20percent_any <- has_fraction_in_any_col(atleast = 0.2, col_indices = c(1, 4, 7))

result <- full_table %>%
  prune_table(keep_rows(at_least_20percent_any)) %>%
  sort_at_path(
    path = c("AEDECOD"),
    scorefun = score_occurrences_cols(col_indices = c(1, 4, 7)),
    decreasing = TRUE
  )

result
```

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

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

## Reusable Configuration For Modules
ADAE <- data[["ADAE"]]

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_events_by_grade(
      label = "Adverse Events by Grade Table",
      dataname = "ADAE",
      arm_var = choices_selected(c("ARM", "ARMCD"), "ARM"),
      col_by_grade = TRUE,
      llt = choices_selected(
        choices = variable_choices(ADAE, c("AETERM", "AEDECOD")),
        selected = c("AEDECOD")
      ),
      hlt = choices_selected(
        choices = variable_choices(ADAE, c("AEBODSYS", "AESOC")),
        selected = "AEBODSYS"
      ),
      grade = choices_selected(
        choices = variable_choices(ADAE, c("AETOXGR", "AESEV")),
        selected = "AETOXGR"
      ),
      # List of column groups for grades used when `col_by_grade` = TRUE.
      grading_groups = list(
        `Any Grade (%)` = c("1", "2", "3", "4", "5"),
        `Grade 3-4 (%)` = c("3", "4"),
        `Grade 5 (%)` = "5"
      )
    )
  )
)

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