TLG Catalog - Stable
  • Stable
    • Dev
  1. Tables
  2. Medical History
  3. MHT01
  • 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. Medical History
  3. MHT01

MHT01

Medical History


Output

  • Standard Table
  • Table of History
    Prior to Study
  • Table with Total Number
    of Conditions Suppressed
  • Table with Total Number of Conditions Per Body
    System After The Summary of Patients
  • Table Showing Additional
    “All Patients” Column
  • Data Setup
  • Preview
  • Try this using WebR
Code
split_fun <- drop_split_levels

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  analyze_num_patients(
    vars = "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c("Total number of patients with at least one condition", "Total number of conditions")
  ) %>%
  split_rows_by(
    var = "MHBODSYS",
    split_fun = split_fun,
    label_pos = "topleft",
    split_label = obj_label(admh_f$MHBODSYS)
  ) %>%
  analyze_num_patients(
    vars = "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c("Total number of patients with at least one condition", "Total number of conditions"),
    show_labels = "hidden"
  ) %>%
  count_occurrences(vars = "MHDECOD") %>%
  append_varlabels(admh_f, "MHDECOD", indent = 1L)

result <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%
  prune_table()

result
MedDRA System Organ Class                                 A: Drug X    B: Placebo    C: Combination
  MedDRA Preferred Term                                    (N=134)       (N=134)        (N=132)    
———————————————————————————————————————————————————————————————————————————————————————————————————
Total number of patients with at least one condition     122 (91.0%)   123 (91.8%)    120 (90.9%)  
Total number of conditions                                   609           622            703      
cl A                                                                                               
  Total number of patients with at least one condition   78 (58.2%)    75 (56.0%)      89 (67.4%)  
  Total number of conditions                                 132           130            160      
  trm A_1/2                                              50 (37.3%)    45 (33.6%)      63 (47.7%)  
  trm A_2/2                                              48 (35.8%)    48 (35.8%)      50 (37.9%)  
cl B                                                                                               
  Total number of patients with at least one condition   96 (71.6%)    89 (66.4%)      97 (73.5%)  
  Total number of conditions                                 185           198            205      
  trm B_1/3                                              47 (35.1%)    49 (36.6%)      43 (32.6%)  
  trm B_2/3                                              49 (36.6%)    44 (32.8%)      52 (39.4%)  
  trm B_3/3                                              48 (35.8%)    54 (40.3%)      51 (38.6%)  
cl C                                                                                               
  Total number of patients with at least one condition   67 (50.0%)    75 (56.0%)      79 (59.8%)  
  Total number of conditions                                 103           116            129      
  trm C_1/2                                              43 (32.1%)    46 (34.3%)      43 (32.6%)  
  trm C_2/2                                              35 (26.1%)    48 (35.8%)      55 (41.7%)  
cl D                                                                                               
  Total number of patients with at least one condition   96 (71.6%)    90 (67.2%)      98 (74.2%)  
  Total number of conditions                                 189           178            209      
  trm D_1/3                                              50 (37.3%)    42 (31.3%)      51 (38.6%)  
  trm D_2/3                                              48 (35.8%)    42 (31.3%)      50 (37.9%)  
  trm D_3/3                                              47 (35.1%)    58 (43.3%)      57 (43.2%)  
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.

  • Preview
  • Try this using WebR
Code
admh_f_prior <- admh_f %>%
  filter(ASTDY <= 0)

result <- build_table(lyt, admh_f_prior, alt_counts_df = adsl_f) %>%
  prune_table()

result
MedDRA System Organ Class                                A: Drug X   B: Placebo   C: Combination
  MedDRA Preferred Term                                   (N=134)     (N=134)        (N=132)    
————————————————————————————————————————————————————————————————————————————————————————————————
Total number of patients with at least one condition         0           0           1 (0.8%)   
Total number of conditions                                   0           0              1       
cl D                                                                                            
  Total number of patients with at least one condition       0           0           1 (0.8%)   
  Total number of conditions                                 0           0              1       
  trm D_2/3                                                  0           0           1 (0.8%)   
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.

  • Preview
  • Try this using WebR
Code
split_fun <- drop_split_levels

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  analyze_num_patients(
    vars = "USUBJID",
    .stats = c("unique"),
    .labels = c("Total number of patients with at least one condition")
  ) %>%
  split_rows_by(
    var = "MHBODSYS",
    split_fun = split_fun,
    label_pos = "topleft",
    split_label = obj_label(admh_f$MHBODSYS)
  ) %>%
  analyze_num_patients(
    vars = "USUBJID",
    .stats = c("unique"),
    .labels = c("Total number of patients with at least one condition"),
    show_labels = "hidden"
  ) %>%
  count_occurrences(vars = "MHDECOD") %>%
  append_varlabels(admh_f, "MHDECOD", indent = 1L)

result <- build_table(lyt, admh_f, alt_counts_df = adsl) %>%
  prune_table()

result
MedDRA System Organ Class                                 A: Drug X    B: Placebo    C: Combination
  MedDRA Preferred Term                                    (N=134)       (N=134)        (N=132)    
———————————————————————————————————————————————————————————————————————————————————————————————————
Total number of patients with at least one condition     122 (91.0%)   123 (91.8%)    120 (90.9%)  
cl A                                                                                               
  Total number of patients with at least one condition   78 (58.2%)    75 (56.0%)      89 (67.4%)  
  trm A_1/2                                              50 (37.3%)    45 (33.6%)      63 (47.7%)  
  trm A_2/2                                              48 (35.8%)    48 (35.8%)      50 (37.9%)  
cl B                                                                                               
  Total number of patients with at least one condition   96 (71.6%)    89 (66.4%)      97 (73.5%)  
  trm B_1/3                                              47 (35.1%)    49 (36.6%)      43 (32.6%)  
  trm B_2/3                                              49 (36.6%)    44 (32.8%)      52 (39.4%)  
  trm B_3/3                                              48 (35.8%)    54 (40.3%)      51 (38.6%)  
cl C                                                                                               
  Total number of patients with at least one condition   67 (50.0%)    75 (56.0%)      79 (59.8%)  
  trm C_1/2                                              43 (32.1%)    46 (34.3%)      43 (32.6%)  
  trm C_2/2                                              35 (26.1%)    48 (35.8%)      55 (41.7%)  
cl D                                                                                               
  Total number of patients with at least one condition   96 (71.6%)    90 (67.2%)      98 (74.2%)  
  trm D_1/3                                              50 (37.3%)    42 (31.3%)      51 (38.6%)  
  trm D_2/3                                              48 (35.8%)    42 (31.3%)      50 (37.9%)  
  trm D_3/3                                              47 (35.1%)    58 (43.3%)      57 (43.2%)  
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.

Not currently supported by rtables. Users, please notify us if this variation is important to you.

Conditions are further sorted by decreasing high level terms and low level terms.

  • Preview
  • Try this using WebR
Code
split_fun <- drop_split_levels

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  add_overall_col("All Patients") %>%
  analyze_num_patients(
    "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c(unique = "Total number of patients with at least one event", nonunique = "Total number of conditions")
  ) %>%
  split_rows_by(
    var = "MHBODSYS",
    split_fun = split_fun,
    child_labels = "visible",
    label_pos = "topleft",
    split_label = obj_label(admh_f$MHBODSYS)
  ) %>%
  summarize_num_patients(
    "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c(unique = "Total number of patients with at least one event", nonunique = "Total number of conditions")
  ) %>%
  count_occurrences(vars = "MHDECOD", .indent_mods = -1L) %>%
  append_varlabels(admh_f, "MHDECOD", indent = 1L)

scorefun_hlt <- cont_n_allcols
scorefun_llt <- score_occurrences_cols(col_indices = nlevels(adsl_f$ACTARM) + 1)

result <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%
  prune_table() %>%
  sort_at_path(path = c("MHBODSYS"), scorefun = scorefun_hlt) %>%
  sort_at_path(path = c("MHBODSYS", "*", "MHDECOD"), scorefun = scorefun_llt)

result
MedDRA System Organ Class                             A: Drug X    B: Placebo    C: Combination   All Patients
  MedDRA Preferred Term                                (N=134)       (N=134)        (N=132)         (N=400)   
——————————————————————————————————————————————————————————————————————————————————————————————————————————————
Total number of patients with at least one event     122 (91.0%)   123 (91.8%)    120 (90.9%)     365 (91.2%) 
Total number of conditions                               609           622            703             1934    
cl D                                                                                                          
  Total number of patients with at least one event   96 (71.6%)    90 (67.2%)      98 (74.2%)     284 (71.0%) 
  Total number of conditions                             189           178            209             576     
  trm D_3/3                                          47 (35.1%)    58 (43.3%)      57 (43.2%)     162 (40.5%) 
  trm D_1/3                                          50 (37.3%)    42 (31.3%)      51 (38.6%)     143 (35.8%) 
  trm D_2/3                                          48 (35.8%)    42 (31.3%)      50 (37.9%)     140 (35.0%) 
cl B                                                                                                          
  Total number of patients with at least one event   96 (71.6%)    89 (66.4%)      97 (73.5%)     282 (70.5%) 
  Total number of conditions                             185           198            205             588     
  trm B_3/3                                          48 (35.8%)    54 (40.3%)      51 (38.6%)     153 (38.2%) 
  trm B_2/3                                          49 (36.6%)    44 (32.8%)      52 (39.4%)     145 (36.2%) 
  trm B_1/3                                          47 (35.1%)    49 (36.6%)      43 (32.6%)     139 (34.8%) 
cl A                                                                                                          
  Total number of patients with at least one event   78 (58.2%)    75 (56.0%)      89 (67.4%)     242 (60.5%) 
  Total number of conditions                             132           130            160             422     
  trm A_1/2                                          50 (37.3%)    45 (33.6%)      63 (47.7%)     158 (39.5%) 
  trm A_2/2                                          48 (35.8%)    48 (35.8%)      50 (37.9%)     146 (36.5%) 
cl C                                                                                                          
  Total number of patients with at least one event   67 (50.0%)    75 (56.0%)      79 (59.8%)     221 (55.2%) 
  Total number of conditions                             103           116            129             348     
  trm C_2/2                                          35 (26.1%)    48 (35.8%)      55 (41.7%)     138 (34.5%) 
  trm C_1/2                                          43 (32.1%)    46 (34.3%)      43 (32.6%)     132 (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(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl
admh <- random.cdisc.data::cadmh

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

adsl_f <- adsl %>%
  filter(SAFFL == "Y") %>%
  select(USUBJID, ACTARM)

admh_f <- admh %>%
  filter(SAFFL == "Y" & MHBODSYS != "" & MHDECOD != "") %>%
  var_relabel(
    MHBODSYS = "MedDRA System Organ Class",
    MHDECOD = "MedDRA Preferred Term"
  )

teal App

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

## Data reproducible code
data <- teal_data()
data <- within(data, {
  library(dplyr)

  ADSL <- random.cdisc.data::cadsl %>%
    filter(SAFFL == "Y")
  ADMH <- random.cdisc.data::cadmh %>%
    filter(SAFFL == "Y" & MHBODSYS != "" & MHDECOD != "")
})
datanames <- c("ADSL", "ADMH")
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
ADMH <- data[["ADMH"]]

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_events(
      label = "Medical History Table",
      dataname = "ADMH",
      arm_var = choices_selected(c("ARM", "ARMCD"), "ARM"),
      llt = choices_selected(
        choices = variable_choices(ADMH, c("MHTERM", "MHDECOD")),
        selected = c("MHDECOD")
      ),
      hlt = choices_selected(
        choices = variable_choices(ADMH, c("MHBODSYS", "MHSOC")),
        selected = "MHBODSYS"
      ),
      add_total = TRUE,
      event_type = "condition"
    )
  )
)

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, {
  library(dplyr)

  ADSL <- random.cdisc.data::cadsl %>%
    filter(SAFFL == "Y")
  ADMH <- random.cdisc.data::cadmh %>%
    filter(SAFFL == "Y" & MHBODSYS != "" & MHDECOD != "")
})
datanames <- c("ADSL", "ADMH")
datanames(data) <- datanames
join_keys(data) <- default_cdisc_join_keys[datanames]

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

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_events(
      label = "Medical History Table",
      dataname = "ADMH",
      arm_var = choices_selected(c("ARM", "ARMCD"), "ARM"),
      llt = choices_selected(
        choices = variable_choices(ADMH, c("MHTERM", "MHDECOD")),
        selected = c("MHDECOD")
      ),
      hlt = choices_selected(
        choices = variable_choices(ADMH, c("MHBODSYS", "MHSOC")),
        selected = "MHBODSYS"
      ),
      add_total = TRUE,
      event_type = "condition"
    )
  )
)

shinyApp(app$ui, app$server)

Reproducibility

Timestamp

[1] "2025-07-09 17:59:03 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-09
 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.4.0    2025-07-08 [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

LBT15
PKCT01
Source Code
---
title: MHT01
subtitle: Medical History
---

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

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

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

adsl <- random.cdisc.data::cadsl
admh <- random.cdisc.data::cadmh

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

adsl_f <- adsl %>%
  filter(SAFFL == "Y") %>%
  select(USUBJID, ACTARM)

admh_f <- admh %>%
  filter(SAFFL == "Y" & MHBODSYS != "" & MHDECOD != "") %>%
  var_relabel(
    MHBODSYS = "MedDRA System Organ Class",
    MHDECOD = "MedDRA Preferred Term"
  )
```

```{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")}
split_fun <- drop_split_levels

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  analyze_num_patients(
    vars = "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c("Total number of patients with at least one condition", "Total number of conditions")
  ) %>%
  split_rows_by(
    var = "MHBODSYS",
    split_fun = split_fun,
    label_pos = "topleft",
    split_label = obj_label(admh_f$MHBODSYS)
  ) %>%
  analyze_num_patients(
    vars = "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c("Total number of patients with at least one condition", "Total number of conditions"),
    show_labels = "hidden"
  ) %>%
  count_occurrences(vars = "MHDECOD") %>%
  append_varlabels(admh_f, "MHDECOD", indent = 1L)

result <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%
  prune_table()

result
```

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

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

## Table of History <br/> Prior to Study

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

```{r variant2, test = list(result_v2 = "result")}
admh_f_prior <- admh_f %>%
  filter(ASTDY <= 0)

result <- build_table(lyt, admh_f_prior, alt_counts_df = adsl_f) %>%
  prune_table()

result
```

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

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

## Table with Total Number <br/> of Conditions Suppressed

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

```{r variant3, test = list(result_v3 = "result")}
split_fun <- drop_split_levels

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  analyze_num_patients(
    vars = "USUBJID",
    .stats = c("unique"),
    .labels = c("Total number of patients with at least one condition")
  ) %>%
  split_rows_by(
    var = "MHBODSYS",
    split_fun = split_fun,
    label_pos = "topleft",
    split_label = obj_label(admh_f$MHBODSYS)
  ) %>%
  analyze_num_patients(
    vars = "USUBJID",
    .stats = c("unique"),
    .labels = c("Total number of patients with at least one condition"),
    show_labels = "hidden"
  ) %>%
  count_occurrences(vars = "MHDECOD") %>%
  append_varlabels(admh_f, "MHDECOD", indent = 1L)

result <- build_table(lyt, admh_f, alt_counts_df = adsl) %>%
  prune_table()

result
```

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

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

## Table with Total Number of Conditions Per Body <br/> System After The Summary of Patients

Not currently supported by `rtables`. Users, please notify us if this variation is important to you.

## Table Showing Additional <br/> "All Patients" Column

Conditions are further sorted by decreasing high level terms and low level terms.

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

```{r variant4, test = list(result_v4 = "result")}
split_fun <- drop_split_levels

lyt <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  add_overall_col("All Patients") %>%
  analyze_num_patients(
    "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c(unique = "Total number of patients with at least one event", nonunique = "Total number of conditions")
  ) %>%
  split_rows_by(
    var = "MHBODSYS",
    split_fun = split_fun,
    child_labels = "visible",
    label_pos = "topleft",
    split_label = obj_label(admh_f$MHBODSYS)
  ) %>%
  summarize_num_patients(
    "USUBJID",
    .stats = c("unique", "nonunique"),
    .labels = c(unique = "Total number of patients with at least one event", nonunique = "Total number of conditions")
  ) %>%
  count_occurrences(vars = "MHDECOD", .indent_mods = -1L) %>%
  append_varlabels(admh_f, "MHDECOD", indent = 1L)

scorefun_hlt <- cont_n_allcols
scorefun_llt <- score_occurrences_cols(col_indices = nlevels(adsl_f$ACTARM) + 1)

result <- build_table(lyt, admh_f, alt_counts_df = adsl_f) %>%
  prune_table() %>%
  sort_at_path(path = c("MHBODSYS"), scorefun = scorefun_hlt) %>%
  sort_at_path(path = c("MHBODSYS", "*", "MHDECOD"), scorefun = scorefun_llt)

result
```

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

{{< 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, {
  library(dplyr)

  ADSL <- random.cdisc.data::cadsl %>%
    filter(SAFFL == "Y")
  ADMH <- random.cdisc.data::cadmh %>%
    filter(SAFFL == "Y" & MHBODSYS != "" & MHDECOD != "")
})
datanames <- c("ADSL", "ADMH")
datanames(data) <- datanames
join_keys(data) <- default_cdisc_join_keys[datanames]

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

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_events(
      label = "Medical History Table",
      dataname = "ADMH",
      arm_var = choices_selected(c("ARM", "ARMCD"), "ARM"),
      llt = choices_selected(
        choices = variable_choices(ADMH, c("MHTERM", "MHDECOD")),
        selected = c("MHDECOD")
      ),
      hlt = choices_selected(
        choices = variable_choices(ADMH, c("MHBODSYS", "MHSOC")),
        selected = "MHBODSYS"
      ),
      add_total = TRUE,
      event_type = "condition"
    )
  )
)

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