--- title: "Example 4: Adverse Events Table" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Example 4: Adverse Events Table} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` The fourth example produces an Adverse Events table by severity, with treatment groups on separate pages. The report shows statistics for All Adverse Events and System Organ Class/Preferred Term. ## Program Note the following about this example: * The `libname()` function from the **[libr](https://libr.r-sassy.org)** package makes it easy to load the entire data library. * Functions from the **[procs](https://procs.r-sassy.org)** package make the code look almost like a SAS® program. * The **[reporter](https://reporter.r-sassy.org)** package is able to wrap treatment groups to separate pages using the _page_wrap_ property. * The **[reporter](https://reporter.r-sassy.org)** package is also able to easily handle page breaks, while still respecting the established margins. ```{r eval=FALSE, echo=TRUE} library(sassy) options("logr.autolog" = TRUE, "logr.notes" = FALSE, "logr.on" = TRUE, "procs.print" = FALSE) # Get temp directory tmp <- tempdir() # Open log lf <- log_open(file.path(tmp, "example4.log")) # Get data dir <- system.file("extdata", package = "sassy") # Get Data ---------------------------------------------------------------- sep("Prepare Data") # Create libname for csv data libname(sdtm, dir, "csv", quiet = TRUE) put("Filter DM data") datastep(sdtm$DM, keep = v(USUBJID, ARM, ARMCD), where = expression(ARM != "SCREEN FAILURE"), {}) -> dm put("Get population counts") proc_freq(dm, tables = ARM, output = long, options = v(nopercent, nonobs)) -> arm_pop put ("Create lookup for AE severity") sevn <- c(MILD = 1, MODERATE = 2, SEVERE = 3) |> put() put("Prepare table data") datastep(sdtm$AE, merge = dm, merge_by = "USUBJID", merge_in = v(inA, inB), keep = v(USUBJID, ARM, AESEV, AESEVN, AESOC, AEDECOD), where = expression(inB == 1 & inA != 0), { AESEVN <- fapply(AESEV, sevn) }) -> ae_sub # Prepare Formats --------------------------------------------------------- sep("Prepare Formats") fc <- fcat(CNT = "%3d", PCT = "(%5.1f)", CAT2 = c(MILD = "Mild", MODERATE = "Moderate", SEVERE = "Severe")) # Perform Calculations ---------------------------------------------------- sep("Perform Calculations") put("Get SOC Frequencies") proc_freq(ae_sub, tables = v(AESOC * AESEV), by = "ARM") -> ae_soc put("Combine columns for SOC") datastep(ae_soc, format = fc, rename = list(VAR1 = "VAR", CAT1 = "CAT"), drop = v(VAR2, CNT, PCT), { VARORD <- 1 CNTPCT <- fapply2(CNT, PCT) CAT2 <- fapply(CAT2) }) -> ae_soc_c put("Pivot SOC frequencies") proc_transpose(ae_soc_c, id = v(BY, CAT2), var = CNTPCT, copy = v(VAR, VARORD), by = CAT) -> ae_soc_t put("Get PT Frequencies") proc_freq(ae_sub, tables = "AEDECOD * AESEV", by = "ARM", options = nonobs) -> ae_pt put("Get unique SOC and PT combinations") proc_sort(ae_sub, keep = v(AESOC, AEDECOD), by = v(AESOC, AEDECOD), options = nodupkey) -> evnts put("Combine columns for PT") datastep(ae_pt, format = fc, rename = list(VAR1 = "VAR", CAT1 = "CAT"), drop = v(VAR2, CNT, PCT), { VARORD <- 2 CNTPCT <- fapply2(CNT, PCT) CAT2 <- fapply(CAT2) }) -> ae_pt_c put("Pivot PT frequencies") proc_transpose(ae_pt_c, id = v(BY, CAT2), var = CNTPCT, copy = v(VAR, VARORD), by = CAT) -> ae_pt_t nms <- names(ae_soc_t) put("Join in SOC") datastep(ae_pt_t, merge = evnts, rename = c(CAT = "CAT2", AESOC = "CAT"), merge_by = c(CAT = "AEDECOD"), { CAT <- toTitleCase(tolower(CAT)) }) -> ae_pt_tj put("Stack SOC and PT counts") datastep(ae_soc_t, set = ae_pt_tj, keep = c("VAR", "CAT", "CAT2", "VARORD", find.names(ae_pt_tj, "ARM*")), {}) -> ae_soc_pt aefinal <- proc_sort(ae_soc_pt, by = v( CAT, VARORD, CAT2)) # All Adverse Events ------------------------------------------------------ put("Get frequencies for all events") proc_freq(ae_sub, tables = "AESEV", by = v(ARM)) -> allfreq put("Combine all events.") datastep(allfreq, format = fc, drop = v(N, CNT, PCT), { CNTPCT <- fapply2(CNT, PCT) CAT <- fapply(CAT, fc$CAT2) }) -> allfreqm put("Prepare data for reporting") proc_transpose(allfreqm, id = v(BY, CAT), var = CNTPCT, copy = VAR, name = CAT) -> allfreqt # Final Data -------------------------------------------------------------- sep("Create final data frame") datastep(allfreqt, set = aefinal, keep = names(aefinal), { if (VAR == "AESEV") CAT <- "All Adverse Events" }) -> allfinal # Print Report ---------------------------------------------------------- sep("Create and print report") put("Create table object") tbl <- create_table(allfinal, first_row_blank = TRUE, width = 9) |> column_defaults(from = `ARM A.Mild`, to = `ARM D.Severe`, width = 1, align = "center") |> spanning_header("ARM A.Mild", "ARM A.Severe", label = "ARM A", n = arm_pop["ARM A"]) |> spanning_header("ARM B.Mild", "ARM B.Severe", label = "ARM B", n = arm_pop["ARM B"]) |> spanning_header("ARM C.Mild", "ARM C.Severe", label = "ARM C", n = arm_pop["ARM C"]) |> spanning_header("ARM D.Mild", "ARM D.Severe", label = "ARM D", n = arm_pop["ARM D"]) |> stub(vars = c("CAT", "CAT2"), label = "System Organ Class\n Preferred Term", width = 5) |> define(CAT, blank_after = TRUE) |> define(CAT2, indent = .25) |> define(`ARM A.Mild`, label = "Mild") |> define(`ARM A.Moderate`, label = "Moderate") |> define(`ARM A.Severe`, label = "Severe") |> define(`ARM B.Mild`, label = "Mild", page_wrap = TRUE) |> define(`ARM B.Moderate`, label = "Moderate") |> define(`ARM B.Severe`, label = "Severe") |> define(`ARM C.Mild`, label = "Mild", page_wrap = TRUE) |> define(`ARM C.Moderate`, label = "Moderate") |> define(`ARM C.Severe`, label = "Severe") |> define(`ARM D.Mild`, label = "Mild", page_wrap = TRUE) |> define(`ARM D.Moderate`,label = "Moderate") |> define(`ARM D.Severe`, label = "Severe") |> define(VAR, visible = FALSE) |> define(VARORD, visible = FALSE) put("Create report object") rpt <- create_report(file.path(tmp, "example4.rtf"), output_type = "RTF", font = "Arial") |> options_fixed(font_size = 10) |> page_header("Sponsor: Company", "Study: ABC") |> titles("Table 5.0", "Adverse Events by Maximum Severity", bold = TRUE) |> add_content(tbl) |> footnotes("Program: AE_Table.R", "Note: Adverse events were coded using MedDRA Version 9.1") |> page_footer(Sys.time(), "Confidential", "Page [pg] of [tpg]") put("Print report") res <- write_report(rpt) # Clean Up ---------------------------------------------------------------- sep("Clean Up") put("Close log") log_close() # Uncomment to view report # file.show(res$modified_path) # Uncomment to view log # file.show(lf) ``` ## Output Here are the first three pages of the output report: ## Log Here is part of the log from the above example: ``` ========================================================================= Log Path: C:/Users/dbosa/AppData/Local/Temp/RtmpEBPgPu/log/example4.log Program Path: C:/packages/Testing/procs/ProcsAE.R Working Directory: C:/packages/Testing/procs User Name: dbosa R Version: 4.3.1 (2023-06-16 ucrt) Machine: SOCRATES x86-64 Operating System: Windows 10 x64 build 22621 Base Packages: stats graphics grDevices utils datasets methods base Other Packages: tidylog_1.0.2 stringr_1.5.0 procs_1.0.3 reporter_1.4.1 libr_1.2.8 fmtr_1.5.9 logr_1.3.4 common_1.0.8 sassy_1.1.0 Log Start Time: 2023-09-05 22:26:16.754728 ========================================================================= ========================================================================= Prepare Data ========================================================================= # library 'sdtm': 7 items - attributes: csv not loaded - path: C:/Users/dbosa/AppData/Local/R/win-library/4.3/sassy/extdata - items: Name Extension Rows Cols Size 1 AE csv 150 27 88.5 Kb 2 DM csv 87 24 45.5 Kb 3 DS csv 174 9 34.1 Kb 4 EX csv 84 11 26.4 Kb 5 IE csv 2 14 13.4 Kb 6 SV csv 685 10 70.3 Kb 7 VS csv 3358 17 467.4 Kb LastModified 1 2023-08-07 17:51:40 2 2023-08-07 17:51:40 3 2023-08-07 17:51:40 4 2023-08-07 17:51:40 5 2023-08-07 17:51:40 6 2023-08-07 17:51:40 7 2023-08-07 17:51:40 Filter DM data datastep: columns decreased from 24 to 3 # A tibble: 85 × 3 USUBJID ARM ARMCD 1 ABC-01-049 ARM D 4 2 ABC-01-050 ARM B 2 3 ABC-01-051 ARM A 1 4 ABC-01-052 ARM C 3 5 ABC-01-053 ARM B 2 6 ABC-01-054 ARM D 4 7 ABC-01-055 ARM C 3 8 ABC-01-056 ARM A 1 9 ABC-01-113 ARM D 4 10 ABC-01-114 ARM B 2 # ℹ 75 more rows # ℹ Use `print(n = ...)` to see more rows Get population counts proc_freq: input data set 85 rows and 3 columns tables: ARM output: long view: TRUE output: 1 datasets # A tibble: 1 × 6 VAR STAT `ARM A` `ARM B` `ARM C` `ARM D` 1 ARM CNT 20 21 21 23 Create lookup for AE severity MILD MODERATE SEVERE 1 2 3 Prepare table data datastep: columns decreased from 27 to 6 # A tibble: 145 × 6 USUBJID ARM AESEV AESEVN AESOC AEDECOD 1 ABC-01-049 ARM D MODERATE 2 Invest… BLOOD … 2 ABC-01-049 ARM D MODERATE 2 Invest… BLOOD … 3 ABC-01-049 ARM D MILD 1 Muscul… MUSCUL… 4 ABC-01-049 ARM D MILD 1 Nervou… HEADAC… 5 ABC-01-049 ARM D MODERATE 2 Invest… LABORA… 6 ABC-01-050 ARM B MILD 1 Respir… UPPER … 7 ABC-01-050 ARM B MILD 1 Skin a… RASH 8 ABC-01-051 ARM A MILD 1 Nervou… HEADAC… 9 ABC-01-051 ARM A MILD 1 Nervou… HEADAC… 10 ABC-01-051 ARM A MILD 1 Genera… INFLUE… # ℹ 135 more rows # ℹ Use `print(n = ...)` to see more rows ========================================================================= Prepare Formats ========================================================================= # A format catalog: 3 formats - $CNT: type S, "%3d" - $PCT: type S, "(%5.1f)" - $CAT2: type V, 3 elements ========================================================================= Perform Calculations ========================================================================= Get SOC Frequencies proc_freq: input data set 145 rows and 6 columns tables: AESOC * AESEV by: ARM view: TRUE output: 1 datasets # A tibble: 240 × 8 BY VAR1 VAR2 CAT1 CAT2 N CNT PCT 1 ARM A AESOC AESEV Blood… MILD 37 0 0 2 ARM A AESOC AESEV Blood… MODE… 37 0 0 3 ARM A AESOC AESEV Blood… SEVE… 37 0 0 4 ARM A AESOC AESEV Cardi… MILD 37 0 0 5 ARM A AESOC AESEV Cardi… MODE… 37 0 0 6 ARM A AESOC AESEV Cardi… SEVE… 37 0 0 7 ARM A AESOC AESEV Conge… MILD 37 0 0 8 ARM A AESOC AESEV Conge… MODE… 37 0 0 9 ARM A AESOC AESEV Conge… SEVE… 37 0 0 10 ARM A AESOC AESEV Ear a… MILD 37 0 0 # ℹ 230 more rows # ℹ Use `print(n = ...)` to see more rows Combine columns for SOC datastep: columns decreased from 8 to 7 # A tibble: 240 × 7 BY VAR CAT CAT2 N VARORD CNTPCT 1 ARM A AESOC Blood and… Mild 37 1 " 0 … 2 ARM A AESOC Blood and… Mode… 37 1 " 0 … 3 ARM A AESOC Blood and… Seve… 37 1 " 0 … 4 ARM A AESOC Cardiac d… Mild 37 1 " 0 … 5 ARM A AESOC Cardiac d… Mode… 37 1 " 0 … 6 ARM A AESOC Cardiac d… Seve… 37 1 " 0 … 7 ARM A AESOC Congenita… Mild 37 1 " 0 … 8 ARM A AESOC Congenita… Mode… 37 1 " 0 … 9 ARM A AESOC Congenita… Seve… 37 1 " 0 … 10 ARM A AESOC Ear and l… Mild 37 1 " 0 … # ℹ 230 more rows # ℹ Use `print(n = ...)` to see more rows Pivot SOC frequencies proc_transpose: input data set 240 rows and 7 columns by: CAT var: CNTPCT id: BY CAT2 copy: VAR VARORD name: NAME output dataset 20 rows and 16 columns # A tibble: 20 × 16 VAR CAT VARORD NAME `ARM A.Mild` 1 AESOC Blood and lymph… 1 CNTP… " 0 ( 0.0… 2 AESOC Cardiac disorde… 1 CNTP… " 0 ( 0.0… 3 AESOC Congenital, fam… 1 CNTP… " 0 ( 0.0… 4 AESOC Ear and labyrin… 1 CNTP… " 0 ( 0.0… 5 AESOC Endocrine disor… 1 CNTP… " 0 ( 0.0… 6 AESOC Gastrointestina… 1 CNTP… " 0 ( 0.0… 7 AESOC General disorde… 1 CNTP… " 2 ( 5.4… 8 AESOC Infections and … 1 CNTP… " 7 ( 18.9… 9 AESOC Injury, poisoni… 1 CNTP… " 0 ( 0.0… 10 AESOC Investigations 1 CNTP… " 4 ( 10.8… 11 AESOC Metabolism and … 1 CNTP… " 0 ( 0.0… 12 AESOC Musculoskeletal… 1 CNTP… " 3 ( 8.1… 13 AESOC Neoplasms benig… 1 CNTP… " 0 ( 0.0… 14 AESOC Nervous system … 1 CNTP… " 7 ( 18.9… 15 AESOC Psychiatric dis… 1 CNTP… " 0 ( 0.0… 16 AESOC Renal and urina… 1 CNTP… " 1 ( 2.7… 17 AESOC Respiratory, th… 1 CNTP… " 2 ( 5.4… 18 AESOC Skin and subcut… 1 CNTP… " 1 ( 2.7… 19 AESOC Surgical and me… 1 CNTP… " 0 ( 0.0… 20 AESOC Vascular disord… 1 CNTP… " 0 ( 0.0… # ℹ 11 more variables: `ARM A.Moderate` , # `ARM A.Severe` , `ARM B.Mild` , # `ARM B.Moderate` , `ARM B.Severe` , # `ARM C.Mild` , `ARM C.Moderate` , # `ARM C.Severe` , `ARM D.Mild` , # `ARM D.Moderate` , `ARM D.Severe` Get PT Frequencies proc_freq: input data set 145 rows and 6 columns tables: AEDECOD * AESEV by: ARM view: TRUE output: 1 datasets # A tibble: 876 × 7 BY VAR1 VAR2 CAT1 CAT2 CNT PCT 1 ARM A AEDECOD AESEV ANXIETY MILD 0 0 2 ARM A AEDECOD AESEV ANXIETY MODE… 0 0 3 ARM A AEDECOD AESEV ANXIETY SEVE… 0 0 4 ARM A AEDECOD AESEV APPLICATI… MILD 0 0 5 ARM A AEDECOD AESEV APPLICATI… MODE… 0 0 6 ARM A AEDECOD AESEV APPLICATI… SEVE… 0 0 7 ARM A AEDECOD AESEV APPLICATI… MILD 0 0 8 ARM A AEDECOD AESEV APPLICATI… MODE… 0 0 9 ARM A AEDECOD AESEV APPLICATI… SEVE… 0 0 10 ARM A AEDECOD AESEV BACK PAIN MILD 2 5.41 # ℹ 866 more rows # ℹ Use `print(n = ...)` to see more rows Get unique SOC and PT combinations proc_sort: input data set 73 rows and 6 columns by: AESOC AEDECOD keep: AESOC AEDECOD order: a a options: nodupkey output data set 73 rows and 2 columns # A tibble: 73 × 2 AESOC AEDECOD 1 Blood and lymphatic system disorders NEUTRO… 2 Cardiac disorders PALPIT… 3 Cardiac disorders SINUS … 4 Congenital, familial and genetic disord… DERMOI… 5 Ear and labyrinth disorders VERTIGO 6 Endocrine disorders PARATH… 7 Gastrointestinal disorders DIARRH… 8 Gastrointestinal disorders FOOD P… 9 Gastrointestinal disorders TOOTHA… 10 Gastrointestinal disorders VOMITI… # ℹ 63 more rows # ℹ Use `print(n = ...)` to see more rows Combine columns for PT datastep: columns decreased from 7 to 6 # A tibble: 876 × 6 BY VAR CAT CAT2 VARORD CNTPCT 1 ARM A AEDECOD ANXIETY Mild 2 " 0 … 2 ARM A AEDECOD ANXIETY Mode… 2 " 0 … 3 ARM A AEDECOD ANXIETY Seve… 2 " 0 … 4 ARM A AEDECOD APPLICATION S… Mild 2 " 0 … 5 ARM A AEDECOD APPLICATION S… Mode… 2 " 0 … 6 ARM A AEDECOD APPLICATION S… Seve… 2 " 0 … 7 ARM A AEDECOD APPLICATION S… Mild 2 " 0 … 8 ARM A AEDECOD APPLICATION S… Mode… 2 " 0 … 9 ARM A AEDECOD APPLICATION S… Seve… 2 " 0 … 10 ARM A AEDECOD BACK PAIN Mild 2 " 2 … # ℹ 866 more rows # ℹ Use `print(n = ...)` to see more rows Pivot PT frequencies proc_transpose: input data set 876 rows and 6 columns by: CAT var: CNTPCT id: BY CAT2 copy: VAR VARORD name: NAME output dataset 73 rows and 16 columns # A tibble: 73 × 16 VAR CAT VARORD NAME `ARM A.Mild` 1 AEDECOD ANXIETY 2 CNTP… " 0 ( 0.0… 2 AEDECOD APPLICATION S… 2 CNTP… " 0 ( 0.0… 3 AEDECOD APPLICATION S… 2 CNTP… " 0 ( 0.0… 4 AEDECOD BACK PAIN 2 CNTP… " 2 ( 5.4… 5 AEDECOD BASAL CELL CA… 2 CNTP… " 0 ( 0.0… 6 AEDECOD BLOOD GLUCOSE… 2 CNTP… " 0 ( 0.0… 7 AEDECOD BLOOD PARATHY… 2 CNTP… " 0 ( 0.0… 8 AEDECOD BLOOD PARATHY… 2 CNTP… " 0 ( 0.0… 9 AEDECOD BLOOD PRESSUR… 2 CNTP… " 1 ( 2.7… 10 AEDECOD BLOOD TRIGLYC… 2 CNTP… " 0 ( 0.0… # ℹ 63 more rows # ℹ 11 more variables: `ARM A.Moderate` , # `ARM A.Severe` , `ARM B.Mild` , # `ARM B.Moderate` , `ARM B.Severe` , # `ARM C.Mild` , `ARM C.Moderate` , # `ARM C.Severe` , `ARM D.Mild` , # `ARM D.Moderate` , `ARM D.Severe` # ℹ Use `print(n = ...)` to see more rows Join in SOC datastep: columns increased from 16 to 17 # A tibble: 73 × 17 VAR CAT2 VARORD NAME `ARM A.Mild` 1 AEDECOD Anxiety 2 CNTP… " 0 ( 0.0… 2 AEDECOD Application S… 2 CNTP… " 0 ( 0.0… 3 AEDECOD Application S… 2 CNTP… " 0 ( 0.0… 4 AEDECOD Back Pain 2 CNTP… " 2 ( 5.4… 5 AEDECOD Basal Cell Ca… 2 CNTP… " 0 ( 0.0… 6 AEDECOD Blood Glucose… 2 CNTP… " 0 ( 0.0… 7 AEDECOD Blood Parathy… 2 CNTP… " 0 ( 0.0… 8 AEDECOD Blood Parathy… 2 CNTP… " 0 ( 0.0… 9 AEDECOD Blood Pressur… 2 CNTP… " 1 ( 2.7… 10 AEDECOD Blood Triglyc… 2 CNTP… " 0 ( 0.0… # ℹ 63 more rows # ℹ 12 more variables: `ARM A.Moderate` , # `ARM A.Severe` , `ARM B.Mild` , # `ARM B.Moderate` , `ARM B.Severe` , # `ARM C.Mild` , `ARM C.Moderate` , # `ARM C.Severe` , `ARM D.Mild` , # `ARM D.Moderate` , … # ℹ Use `print(n = ...)` to see more rows Stack SOC and PT counts datastep: columns started with 16 and ended with 16 # A tibble: 93 × 16 VAR CAT CAT2 VARORD `ARM A.Mild` 1 AESOC Blood and lymph… 1 " 0 ( 0.0… 2 AESOC Cardiac disorde… 1 " 0 ( 0.0… 3 AESOC Congenital, fam… 1 " 0 ( 0.0… 4 AESOC Ear and labyrin… 1 " 0 ( 0.0… 5 AESOC Endocrine disor… 1 " 0 ( 0.0… 6 AESOC Gastrointestina… 1 " 0 ( 0.0… 7 AESOC General disorde… 1 " 2 ( 5.4… 8 AESOC Infections and … 1 " 7 ( 18.9… 9 AESOC Injury, poisoni… 1 " 0 ( 0.0… 10 AESOC Investigations 1 " 4 ( 10.8… # ℹ 83 more rows # ℹ 11 more variables: `ARM A.Moderate` , # `ARM A.Severe` , `ARM B.Mild` , # `ARM B.Moderate` , `ARM B.Severe` , # `ARM C.Mild` , `ARM C.Moderate` , # `ARM C.Severe` , `ARM D.Mild` , # `ARM D.Moderate` , `ARM D.Severe` # ℹ Use `print(n = ...)` to see more rows proc_sort: input data set 93 rows and 16 columns by: CAT VARORD CAT2 keep: VAR CAT CAT2 VARORD ARM A.Mild ARM A.Moderate ARM A.Severe ARM B.Mild ARM B.Moderate ARM B.Severe ARM C.Mild ARM C.Moderate ARM C.Severe ARM D.Mild ARM D.Moderate ARM D.Severe order: a a a output data set 93 rows and 16 columns # A tibble: 93 × 16 VAR CAT CAT2 VARORD `ARM A.Mild` 1 AESOC Blood and lym… 1 " 0 ( 0.0… 2 AEDECOD Blood and lym… Neut… 2 " 0 ( 0.0… 3 AESOC Cardiac disor… 1 " 0 ( 0.0… 4 AEDECOD Cardiac disor… Palp… 2 " 0 ( 0.0… 5 AEDECOD Cardiac disor… Sinu… 2 " 0 ( 0.0… 6 AESOC Congenital, f… 1 " 0 ( 0.0… 7 AEDECOD Congenital, f… Derm… 2 " 0 ( 0.0… 8 AESOC Ear and labyr… 1 " 0 ( 0.0… 9 AEDECOD Ear and labyr… Vert… 2 " 0 ( 0.0… 10 AESOC Endocrine dis… 1 " 0 ( 0.0… # ℹ 83 more rows # ℹ 11 more variables: `ARM A.Moderate` , # `ARM A.Severe` , `ARM B.Mild` , # `ARM B.Moderate` , `ARM B.Severe` , # `ARM C.Mild` , `ARM C.Moderate` , # `ARM C.Severe` , `ARM D.Mild` , # `ARM D.Moderate` , `ARM D.Severe` # ℹ Use `print(n = ...)` to see more rows Get frequencies for all events proc_freq: input data set 145 rows and 6 columns tables: AESEV by: ARM view: TRUE output: 1 datasets # A tibble: 12 × 6 BY VAR CAT N CNT PCT 1 ARM A AESEV MILD 37 27 73.0 2 ARM A AESEV MODERATE 37 10 27.0 3 ARM A AESEV SEVERE 37 0 0 4 ARM B AESEV MILD 32 24 75 5 ARM B AESEV MODERATE 32 6 18.8 6 ARM B AESEV SEVERE 32 2 6.25 7 ARM C AESEV MILD 36 29 80.6 8 ARM C AESEV MODERATE 36 7 19.4 9 ARM C AESEV SEVERE 36 0 0 10 ARM D AESEV MILD 40 31 77.5 11 ARM D AESEV MODERATE 40 9 22.5 12 ARM D AESEV SEVERE 40 0 0 Combine all events. datastep: columns decreased from 6 to 4 # A tibble: 12 × 4 BY VAR CAT CNTPCT 1 ARM A AESEV Mild " 27 ( 73.0)" 2 ARM A AESEV Moderate " 10 ( 27.0)" 3 ARM A AESEV Severe " 0 ( 0.0)" 4 ARM B AESEV Mild " 24 ( 75.0)" 5 ARM B AESEV Moderate " 6 ( 18.8)" 6 ARM B AESEV Severe " 2 ( 6.2)" 7 ARM C AESEV Mild " 29 ( 80.6)" 8 ARM C AESEV Moderate " 7 ( 19.4)" 9 ARM C AESEV Severe " 0 ( 0.0)" 10 ARM D AESEV Mild " 31 ( 77.5)" 11 ARM D AESEV Moderate " 9 ( 22.5)" 12 ARM D AESEV Severe " 0 ( 0.0)" Prepare data for reporting proc_transpose: input data set 12 rows and 4 columns var: CNTPCT id: BY CAT copy: VAR name: CAT output dataset 1 rows and 14 columns # A tibble: 1 × 14 VAR CAT `ARM A.Mild` `ARM A.Moderate` 1 AESEV CNTPCT " 27 ( 73.0)" " 10 ( 27.0)" # ℹ 10 more variables: `ARM A.Severe` , # `ARM B.Mild` , `ARM B.Moderate` , # `ARM B.Severe` , `ARM C.Mild` , # `ARM C.Moderate` , `ARM C.Severe` , # `ARM D.Mild` , `ARM D.Moderate` , # `ARM D.Severe` ========================================================================= Create final data frame ========================================================================= datastep: columns increased from 14 to 16 # A tibble: 94 × 16 VAR CAT CAT2 VARORD `ARM A.Mild` 1 AESEV All Adverse E… NA " 27 ( 73.0… 2 AESOC Blood and lym… 1 " 0 ( 0.0… 3 AEDECOD Blood and lym… Neut… 2 " 0 ( 0.0… 4 AESOC Cardiac disor… 1 " 0 ( 0.0… 5 AEDECOD Cardiac disor… Palp… 2 " 0 ( 0.0… 6 AEDECOD Cardiac disor… Sinu… 2 " 0 ( 0.0… 7 AESOC Congenital, f… 1 " 0 ( 0.0… 8 AEDECOD Congenital, f… Derm… 2 " 0 ( 0.0… 9 AESOC Ear and labyr… 1 " 0 ( 0.0… 10 AEDECOD Ear and labyr… Vert… 2 " 0 ( 0.0… # ℹ 84 more rows # ℹ 11 more variables: `ARM A.Moderate` , # `ARM A.Severe` , `ARM B.Mild` , # `ARM B.Moderate` , `ARM B.Severe` , # `ARM C.Mild` , `ARM C.Moderate` , # `ARM C.Severe` , `ARM D.Mild` , # `ARM D.Moderate` , `ARM D.Severe` # ℹ Use `print(n = ...)` to see more rows ========================================================================= Create and print report ========================================================================= Create table object Create report object Print report # A report specification: 16 pages - file_path: 'C:\Users\dbosa\AppData\Local\Temp\RtmpEBPgPu/example4.rtf' - output_type: RTF - units: inches - orientation: landscape - margins: top 0.5 bottom 0.5 left 1 right 1 - line size/count: 9/42 - page_header: left=Sponsor: Company right=Study: ABC - title 1: 'Table 5.0' - title 2: 'Adverse Events by Maximum Severity' - footnote 1: 'Program: AE_Table.R' - footnote 2: 'Note: Adverse events were coded using MedDRA Version 9.1' - page_footer: left=2023-09-05 22:26:19.941609 center=Confidential right=Page [pg] of [tpg] - content: # A table specification: - data: tibble 'allfinal' 94 rows 16 cols - show_cols: all - use_attributes: all - width: 9 - spanning_header: from='ARM A.Mild' to='ARM A.Severe' 'ARM A' level=1 - spanning_header: from='ARM B.Mild' to='ARM B.Severe' 'ARM B' level=1 - spanning_header: from='ARM C.Mild' to='ARM C.Severe' 'ARM C' level=1 - spanning_header: from='ARM D.Mild' to='ARM D.Severe' 'ARM D' level=1 - stub: CAT CAT2 'System Organ Class Preferred Term' width=5 align='left' - define: CAT - define: CAT2 - define: ARM A.Mild 'Mild' - define: ARM A.Moderate 'Moderate' - define: ARM A.Severe 'Severe' - define: ARM B.Mild 'Mild' page_wrap='TRUE' - define: ARM B.Moderate 'Moderate' - define: ARM B.Severe 'Severe' - define: ARM C.Mild 'Mild' page_wrap='TRUE' - define: ARM C.Moderate 'Moderate' - define: ARM C.Severe 'Severe' - define: ARM D.Mild 'Mild' page_wrap='TRUE' - define: ARM D.Moderate 'Moderate' - define: ARM D.Severe 'Severe' - define: VAR visible='FALSE' - define: VARORD visible='FALSE' ========================================================================= Clean Up ========================================================================= Remove library from workspace lib_sync: synchronized data in library 'sdtm' Close log ========================================================================= Log End Time: 2023-09-05 22:26:20.855023 Log Elapsed Time: 0 00:00:04 ========================================================================= ``` Next: [Example 5: Vital Signs Table](sassy-vs.html)