--- title: "Example 14: AE Severity in Rows" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Example 14: AE Severity in Rows} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` The 14th example is similar to the Adverse Events table produced in Example 4. In this example, however, the severity grades are shown in rows instead of columns. This table is somewhat easier to read than the previous example, because the pages do not wrap. ## Program Note the following about this example: * Functions from the **[procs](https://procs.r-sassy.org)** package make the code look almost like a SAS® program. * Page breaking is controlled by the user variable PG. This variable allows you to control when the page breaks occur. Identify the paging variable using the _page_break_ parameter on the `define()` function. * Complexity of the stub column forced this example to perform the indenting in the data preparation steps. You can always create the stub column yourself if the `stub()` function is not allowing you to do what you need. ```{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, "example14.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("Prepare table data") datastep(sdtm$AE, merge = dm, merge_by = "USUBJID", merge_in = v(inA, inB), keep = v(USUBJID, ARM, AESEV, AESOC, AEDECOD), where = expression(inB == 1 & inA != 0), {}) -> ae_sub # Prepare Formats --------------------------------------------------------- sep("Prepare Formats") fc <- fcat(CNT = "%3d", PCT = "(%5.1f)", CAT2 = c(MILD = "Mild", MODERATE = "Moderate", SEVERE = "Severe"), SEVN = c(Mild = 1, Moderate = 2, Severe = 3)) # 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), var = CNTPCT, copy = v(VAR, VARORD), by = v(CAT, CAT2)) |> datastep(rename = c(CAT = "AESOC", CAT2 = "SEVERITY"), drop = "NAME", { AEDECOD <- NA_character_ }) -> 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), var = CNTPCT, copy = v(VAR, VARORD), by = v(CAT, CAT2)) -> ae_pt_t nms <- names(ae_soc_t) put("Join in SOC") datastep(ae_pt_t, merge = evnts, rename = c(CAT2 = "SEVERITY", CAT = "AEDECOD"), merge_by = c(CAT = "AEDECOD"), { CAT <- toTitleCase(tolower(CAT)) AESEVN <- fapply(CAT2, fc$SEVN) }) -> ae_pt_tj # 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, CAT), { CNTPCT <- fapply2(CNT, PCT) SEVERITY <- fapply(CAT, fc$CAT2) VARORD <- 0 }) -> allfreqm put("Prepare data for reporting") proc_transpose(allfreqm, id = v(BY), var = CNTPCT, by = v(SEVERITY), copy = v(VAR, VARORD)) -> allfreqt put("Clean up") datastep(allfreqt, drop = NAME, { AESOC <- "All Adverse Events" AEDECOD <- "All Preferred Terms " }) -> allfreqtc # Prepare Final Dataframe ------------------------------------------------- put("Stack SOC and PT counts") datastep(ae_soc_t, set = list(allfreqtc, ae_pt_tj), keep = c("VAR", "AESOC", "AEDECOD", "SEVERITY", "AESEVN", "VARORD", find.names(ae_pt_tj, "ARM*")), { AESEVN <- fapply(SEVERITY, fc$SEVN) if (is.na(AEDECOD)) AEDECOD <- "All Preferred Terms" }) -> ae_soc_pt put("Select desired columns") datastep(ae_soc_pt, keep = c("AESOC", "AEDECOD", "AESEVN", "VARORD"), where = expression(AESEVN == 1), { }) -> ae_prep put("Output extra rows") datastep(ae_prep, { AESEVN <- 0 output() AESEVN <- -1 output() }) -> ae_soc_rows put("Set additonal rows") datastep(ae_soc_pt, set = ae_soc_rows, {}) -> ae_all put("Sort combined rows") aecombined <- proc_sort(ae_all, by = v( AESOC, VARORD, AEDECOD, AESEVN)) put("Create stub and paging.") datastep(aecombined, retain = list(PG = 1, RWNM = 0), { if (AESEVN == -1) { VAR <- AESOC } else if (AESEVN == 0) { VAR <- " " %p% AEDECOD } else { VAR <- " " %p% SEVERITY } RWNM <- RWNM + 1 if (RWNM == 21) { PG <- PG + 1 RWNM <- 1 } }) -> aefinal # Print Report ---------------------------------------------------------- sep("Create and print report") put("Create table object") tbl <- create_table(aefinal, first_row_blank = TRUE, width = 9, show_cols = "none") |> column_defaults(from = `ARM A`, to = `ARM D`, width = 1, align = "center") |> define(VAR, label = "System Organ Class\n Preferred Term\n Maximum Grade") |> define(AEDECOD, visible = FALSE, blank_after = TRUE) |> define(`ARM A`, label = "Placebo", n = arm_pop["ARM A"]) |> define(`ARM B`, label = "Drug A", n = arm_pop["ARM B"]) |> define(`ARM C`, label = "Drug B", n = arm_pop["ARM C"]) |> define(`ARM D`, label = "Drug C", n = arm_pop["ARM D"]) |> define(PG, visible = FALSE, page_break = TRUE) put("Create report object") rpt <- create_report(file.path(tmp, "example14.rtf"), output_type = "RTF", font_size = 10, font = "Arial") |> page_header(left = c("Sponsor: Company", "Protocol: ABC-123"), right = c("Page [pg] of [tpg]", "Database: 2023-10-01")) |> titles("Table 5.2.4", "Summary of Treatment-Emergent Adverse Events by MedDRA System Organ Class", "Preferred Term, and Maximum Severity", "(Safety Population)", font_size = 12, bold = TRUE, borders = "bottom") |> add_content(tbl) |> footnotes("Program: AE_Table.R", "Confidential", fapply(Sys.time(), "%Y-%m-%d %H:%M:%S"), columns = 3, borders = "top", blank_row = "none") |> footnotes("Treatment-Emergent AEs: any AE either reported for the first time or " %p% "worsening of a pre-existing event after firstdose of study drug " %p% "until 31 days after the last dose of study drug", "Note: Participants where counted only once under the highest grade; " %p% "TEAEs with missing severity were included under 'Any Grade' only.", "Severity vs CTCAE Grade: Mild = Grade 1, Moderate = Grade 2, " %p% "Severe = Grade 3, Life-Threatening = Grade 4, Fatal = Grade 5.", "MedDRA Version: 23.0", footer = TRUE) 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 is the first page of the output report: ## Log Here is the log from the above example: ``` ========================================================================= Log Path: C:/Users/dbosa/AppData/Local/Temp/Rtmp4q58ap/log/example13.log Program Path: C:/packages/Testing/incyte/newcode/aeflipped.R Working Directory: C:/packages/Testing 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 procs_1.0.3 reporter_1.4.2 libr_1.2.8 logr_1.3.4 fmtr_1.6.0 common_1.0.9 sassy_1.2.1 Log Start Time: 2023-10-14 14:26:59.112062 ========================================================================= ========================================================================= 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 LastModified 1 AE csv 150 27 88.5 Kb 2023-09-30 23:58:49 2 DM csv 87 24 45.5 Kb 2023-09-30 23:58:49 3 DS csv 174 9 34.1 Kb 2023-09-30 23:58:49 4 EX csv 84 11 26.4 Kb 2023-09-30 23:58:49 5 IE csv 2 14 13.4 Kb 2023-09-30 23:58:49 6 SV csv 685 10 70.3 Kb 2023-09-30 23:58:49 7 VS csv 3358 17 467.4 Kb 2023-09-30 23:58:49 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 Prepare table data datastep: columns decreased from 27 to 5 # A tibble: 145 × 5 USUBJID ARM AESEV AESOC AEDECOD 1 ABC-01-049 ARM D MODERATE Investigations BLOOD … 2 ABC-01-049 ARM D MODERATE Investigations BLOOD … 3 ABC-01-049 ARM D MILD Musculoskeletal and connective tissue disorders MUSCUL… 4 ABC-01-049 ARM D MILD Nervous system disorders HEADAC… 5 ABC-01-049 ARM D MODERATE Investigations LABORA… 6 ABC-01-050 ARM B MILD Respiratory, thoracic and mediastinal disorders UPPER … 7 ABC-01-050 ARM B MILD Skin and subcutaneous tissue disorders RASH 8 ABC-01-051 ARM A MILD Nervous system disorders HEADAC… 9 ABC-01-051 ARM A MILD Nervous system disorders HEADAC… 10 ABC-01-051 ARM A MILD General disorders and administration site cond… INFLUE… # ℹ 135 more rows # ℹ Use `print(n = ...)` to see more rows ========================================================================= Prepare Formats ========================================================================= # A format catalog: 4 formats - $CNT: type S, "%3d" - $PCT: type S, "(%5.1f)" - $CAT2: type V, 3 elements - $SEVN: type V, 3 elements ========================================================================= Perform Calculations ========================================================================= Get SOC Frequencies proc_freq: input data set 145 rows and 5 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 and lymphatic system disorders MILD 37 0 0 2 ARM A AESOC AESEV Blood and lymphatic system disorders MODE… 37 0 0 3 ARM A AESOC AESEV Blood and lymphatic system disorders SEVE… 37 0 0 4 ARM A AESOC AESEV Cardiac disorders MILD 37 0 0 5 ARM A AESOC AESEV Cardiac disorders MODE… 37 0 0 6 ARM A AESOC AESEV Cardiac disorders SEVE… 37 0 0 7 ARM A AESOC AESEV Congenital, familial and genetic disor… MILD 37 0 0 8 ARM A AESOC AESEV Congenital, familial and genetic disor… MODE… 37 0 0 9 ARM A AESOC AESEV Congenital, familial and genetic disor… SEVE… 37 0 0 10 ARM A AESOC AESEV Ear and labyrinth disorders 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 lymphatic system disorders Mild 37 1 " 0 … 2 ARM A AESOC Blood and lymphatic system disorders Moder… 37 1 " 0 … 3 ARM A AESOC Blood and lymphatic system disorders Severe 37 1 " 0 … 4 ARM A AESOC Cardiac disorders Mild 37 1 " 0 … 5 ARM A AESOC Cardiac disorders Moder… 37 1 " 0 … 6 ARM A AESOC Cardiac disorders Severe 37 1 " 0 … 7 ARM A AESOC Congenital, familial and genetic disorders Mild 37 1 " 0 … 8 ARM A AESOC Congenital, familial and genetic disorders Moder… 37 1 " 0 … 9 ARM A AESOC Congenital, familial and genetic disorders Severe 37 1 " 0 … 10 ARM A AESOC Ear and labyrinth disorders 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 CAT2 var: CNTPCT id: BY copy: VAR VARORD name: NAME output dataset 60 rows and 9 columns # A tibble: 60 × 9 VAR CAT CAT2 VARORD NAME `ARM A` `ARM B` `ARM C` `ARM D` 1 AESOC Blood and lymphatic sys… Mild 1 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… 2 AESOC Cardiac disorders Mild 1 CNTP… " 0 (… " 0 (… " 0 (… " 2 (… 3 AESOC Congenital, familial an… Mild 1 CNTP… " 0 (… " 1 (… " 0 (… " 0 (… 4 AESOC Ear and labyrinth disor… Mild 1 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… 5 AESOC Endocrine disorders Mild 1 CNTP… " 0 (… " 0 (… " 1 (… " 0 (… 6 AESOC Gastrointestinal disord… Mild 1 CNTP… " 0 (… " 4 (… " 0 (… " 2 (… 7 AESOC General disorders and a… Mild 1 CNTP… " 2 (… " 0 (… " 3 (… " 2 (… 8 AESOC Infections and infestat… Mild 1 CNTP… " 7 (… " 7 (… " 6 (… " 6 (… 9 AESOC Injury, poisoning and p… Mild 1 CNTP… " 0 (… " 0 (… " 0 (… " 1 (… 10 AESOC Investigations Mild 1 CNTP… " 4 (… " 1 (… " 2 (… " 5 (… # ℹ 50 more rows # ℹ Use `print(n = ...)` to see more rows datastep: columns started with 9 and ended with 9 # A tibble: 60 × 9 VAR AESOC SEVERITY VARORD `ARM A` `ARM B` `ARM C` `ARM D` AEDECOD 1 AESOC Blood and lymphati… Mild 1 " 0 (… " 0 (… " 0 (… " 0 (… 2 AESOC Cardiac disorders Mild 1 " 0 (… " 0 (… " 0 (… " 2 (… 3 AESOC Congenital, famili… Mild 1 " 0 (… " 1 (… " 0 (… " 0 (… 4 AESOC Ear and labyrinth … Mild 1 " 0 (… " 0 (… " 0 (… " 0 (… 5 AESOC Endocrine disorders Mild 1 " 0 (… " 0 (… " 1 (… " 0 (… 6 AESOC Gastrointestinal d… Mild 1 " 0 (… " 4 (… " 0 (… " 2 (… 7 AESOC General disorders … Mild 1 " 2 (… " 0 (… " 3 (… " 2 (… 8 AESOC Infections and inf… Mild 1 " 7 (… " 7 (… " 6 (… " 6 (… 9 AESOC Injury, poisoning … Mild 1 " 0 (… " 0 (… " 0 (… " 1 (… 10 AESOC Investigations Mild 1 " 4 (… " 1 (… " 2 (… " 5 (… # ℹ 50 more rows # ℹ Use `print(n = ...)` to see more rows Get PT Frequencies proc_freq: input data set 145 rows and 5 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 MODERATE 0 0 3 ARM A AEDECOD AESEV ANXIETY SEVERE 0 0 4 ARM A AEDECOD AESEV APPLICATION SITE HYPERSENSITIVITY MILD 0 0 5 ARM A AEDECOD AESEV APPLICATION SITE HYPERSENSITIVITY MODERATE 0 0 6 ARM A AEDECOD AESEV APPLICATION SITE HYPERSENSITIVITY SEVERE 0 0 7 ARM A AEDECOD AESEV APPLICATION SITE IRRITATION MILD 0 0 8 ARM A AEDECOD AESEV APPLICATION SITE IRRITATION MODERATE 0 0 9 ARM A AEDECOD AESEV APPLICATION SITE IRRITATION SEVERE 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 5 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 NEUTROPENIA 2 Cardiac disorders PALPITATIONS 3 Cardiac disorders SINUS BRADYCARDIA 4 Congenital, familial and genetic disorders DERMOID CYST 5 Ear and labyrinth disorders VERTIGO 6 Endocrine disorders PARATHYROID DISORDER 7 Gastrointestinal disorders DIARRHOEA 8 Gastrointestinal disorders FOOD POISONING 9 Gastrointestinal disorders TOOTHACHE 10 Gastrointestinal disorders VOMITING # ℹ 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 ( 0.0)" 2 ARM A AEDECOD ANXIETY Moderate 2 " 0 ( 0.0)" 3 ARM A AEDECOD ANXIETY Severe 2 " 0 ( 0.0)" 4 ARM A AEDECOD APPLICATION SITE HYPERSENSITIVITY Mild 2 " 0 ( 0.0)" 5 ARM A AEDECOD APPLICATION SITE HYPERSENSITIVITY Moderate 2 " 0 ( 0.0)" 6 ARM A AEDECOD APPLICATION SITE HYPERSENSITIVITY Severe 2 " 0 ( 0.0)" 7 ARM A AEDECOD APPLICATION SITE IRRITATION Mild 2 " 0 ( 0.0)" 8 ARM A AEDECOD APPLICATION SITE IRRITATION Moderate 2 " 0 ( 0.0)" 9 ARM A AEDECOD APPLICATION SITE IRRITATION Severe 2 " 0 ( 0.0)" 10 ARM A AEDECOD BACK PAIN Mild 2 " 2 ( 5.4)" # ℹ 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 CAT2 var: CNTPCT id: BY copy: VAR VARORD name: NAME output dataset 219 rows and 9 columns # A tibble: 219 × 9 VAR CAT CAT2 VARORD NAME `ARM A` `ARM B` `ARM C` `ARM D` 1 AEDECOD ANXIETY Mild 2 CNTP… " 0 (… " 0 (… " 0 (… " 1 (… 2 AEDECOD APPLICATION SITE HYPE… Mild 2 CNTP… " 0 (… " 0 (… " 1 (… " 0 (… 3 AEDECOD APPLICATION SITE IRRI… Mild 2 CNTP… " 0 (… " 0 (… " 1 (… " 1 (… 4 AEDECOD BACK PAIN Mild 2 CNTP… " 2 (… " 0 (… " 0 (… " 1 (… 5 AEDECOD BASAL CELL CARCINOMA Mild 2 CNTP… " 0 (… " 1 (… " 0 (… " 0 (… 6 AEDECOD BLOOD GLUCOSE INCREAS… Mild 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… 7 AEDECOD BLOOD PARATHYROID HOR… Mild 2 CNTP… " 0 (… " 1 (… " 0 (… " 0 (… 8 AEDECOD BLOOD PARATHYROID HOR… Mild 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… 9 AEDECOD BLOOD PRESSURE INCREA… Mild 2 CNTP… " 1 (… " 0 (… " 0 (… " 1 (… 10 AEDECOD BLOOD TRIGLYCERIDES I… Mild 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… # ℹ 209 more rows # ℹ Use `print(n = ...)` to see more rows Join in SOC datastep: columns increased from 9 to 11 # A tibble: 219 × 11 VAR AEDECOD SEVERITY VARORD NAME `ARM A` `ARM B` `ARM C` `ARM D` AESOC AESEVN 1 AEDEC… Anxiety Mild 2 CNTP… " 0 (… " 0 (… " 0 (… " 1 (… Psyc… 1 2 AEDEC… Anxiety Severe 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… Psyc… 3 3 AEDEC… Anxiety Moderate 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… Psyc… 2 4 AEDEC… Applic… Severe 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… Gene… 3 5 AEDEC… Applic… Moderate 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… Gene… 2 6 AEDEC… Applic… Mild 2 CNTP… " 0 (… " 0 (… " 1 (… " 0 (… Gene… 1 7 AEDEC… Applic… Mild 2 CNTP… " 0 (… " 0 (… " 1 (… " 1 (… Gene… 1 8 AEDEC… Applic… Severe 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… Gene… 3 9 AEDEC… Applic… Moderate 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… Gene… 2 10 AEDEC… Back P… Severe 2 CNTP… " 0 (… " 0 (… " 0 (… " 0 (… Musc… 3 # ℹ 209 more rows # ℹ Use `print(n = ...)` to see more rows Get frequencies for all events proc_freq: input data set 145 rows and 5 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 5 # A tibble: 12 × 5 BY VAR CNTPCT SEVERITY VARORD 1 ARM A AESEV " 27 ( 73.0)" Mild 0 2 ARM A AESEV " 10 ( 27.0)" Moderate 0 3 ARM A AESEV " 0 ( 0.0)" Severe 0 4 ARM B AESEV " 24 ( 75.0)" Mild 0 5 ARM B AESEV " 6 ( 18.8)" Moderate 0 6 ARM B AESEV " 2 ( 6.2)" Severe 0 7 ARM C AESEV " 29 ( 80.6)" Mild 0 8 ARM C AESEV " 7 ( 19.4)" Moderate 0 9 ARM C AESEV " 0 ( 0.0)" Severe 0 10 ARM D AESEV " 31 ( 77.5)" Mild 0 11 ARM D AESEV " 9 ( 22.5)" Moderate 0 12 ARM D AESEV " 0 ( 0.0)" Severe 0 Prepare data for reporting proc_transpose: input data set 12 rows and 5 columns by: SEVERITY var: CNTPCT id: BY copy: VAR VARORD name: NAME output dataset 3 rows and 8 columns # A tibble: 3 × 8 VAR SEVERITY VARORD NAME `ARM A` `ARM B` `ARM C` `ARM D` 1 AESEV Mild 0 CNTPCT " 27 ( 73.0)" " 24 ( 75.0)" " 29 ( 80.6)" " 31 ( 77.… 2 AESEV Moderate 0 CNTPCT " 10 ( 27.0)" " 6 ( 18.8)" " 7 ( 19.4)" " 9 ( 22.… 3 AESEV Severe 0 CNTPCT " 0 ( 0.0)" " 2 ( 6.2)" " 0 ( 0.0)" " 0 ( 0.… Clean up datastep: columns increased from 8 to 9 # A tibble: 3 × 9 VAR SEVERITY VARORD `ARM A` `ARM B` `ARM C` `ARM D` AESOC AEDECOD 1 AESEV Mild 0 " 27 ( 73.0)" " 24 ( 75.0)" " 29 ( 80… " 31 (… All … "All P… 2 AESEV Moderate 0 " 10 ( 27.0)" " 6 ( 18.8)" " 7 ( 19… " 9 (… All … "All P… 3 AESEV Severe 0 " 0 ( 0.0)" " 2 ( 6.2)" " 0 ( 0… " 0 (… All … "All P… Stack SOC and PT counts datastep: columns increased from 9 to 10 # A tibble: 282 × 10 VAR AESOC AEDECOD SEVERITY AESEVN VARORD `ARM A` `ARM B` `ARM C` `ARM D` 1 AESOC Blood and l… All Pr… Mild 1 1 " 0 (… " 0 (… " 0 (… " 0 (… 2 AESOC Cardiac dis… All Pr… Mild 1 1 " 0 (… " 0 (… " 0 (… " 2 (… 3 AESOC Congenital,… All Pr… Mild 1 1 " 0 (… " 1 (… " 0 (… " 0 (… 4 AESOC Ear and lab… All Pr… Mild 1 1 " 0 (… " 0 (… " 0 (… " 0 (… 5 AESOC Endocrine d… All Pr… Mild 1 1 " 0 (… " 0 (… " 1 (… " 0 (… 6 AESOC Gastrointes… All Pr… Mild 1 1 " 0 (… " 4 (… " 0 (… " 2 (… 7 AESOC General dis… All Pr… Mild 1 1 " 2 (… " 0 (… " 3 (… " 2 (… 8 AESOC Infections … All Pr… Mild 1 1 " 7 (… " 7 (… " 6 (… " 6 (… 9 AESOC Injury, poi… All Pr… Mild 1 1 " 0 (… " 0 (… " 0 (… " 1 (… 10 AESOC Investigati… All Pr… Mild 1 1 " 4 (… " 1 (… " 2 (… " 5 (… # ℹ 272 more rows # ℹ Use `print(n = ...)` to see more rows Select desired columns datastep: columns decreased from 10 to 4 # A tibble: 94 × 4 AESOC AEDECOD AESEVN VARORD 1 Blood and lymphatic system disorders All Preferred… 1 1 2 Cardiac disorders All Preferred… 1 1 3 Congenital, familial and genetic disorders All Preferred… 1 1 4 Ear and labyrinth disorders All Preferred… 1 1 5 Endocrine disorders All Preferred… 1 1 6 Gastrointestinal disorders All Preferred… 1 1 7 General disorders and administration site conditions All Preferred… 1 1 8 Infections and infestations All Preferred… 1 1 9 Injury, poisoning and procedural complications All Preferred… 1 1 10 Investigations All Preferred… 1 1 # ℹ 84 more rows # ℹ Use `print(n = ...)` to see more rows Output extra rows datastep: columns started with 4 and ended with 4 # A tibble: 188 × 4 AESOC AEDECOD AESEVN VARORD 1 Blood and lymphatic system disorders All Preferred Terms 0 1 2 Blood and lymphatic system disorders All Preferred Terms -1 1 3 Cardiac disorders All Preferred Terms 0 1 4 Cardiac disorders All Preferred Terms -1 1 5 Congenital, familial and genetic disorders All Preferred Terms 0 1 6 Congenital, familial and genetic disorders All Preferred Terms -1 1 7 Ear and labyrinth disorders All Preferred Terms 0 1 8 Ear and labyrinth disorders All Preferred Terms -1 1 9 Endocrine disorders All Preferred Terms 0 1 10 Endocrine disorders All Preferred Terms -1 1 # ℹ 178 more rows # ℹ Use `print(n = ...)` to see more rows Set additonal rows datastep: columns started with 10 and ended with 10 # A tibble: 470 × 10 VAR AESOC AEDECOD SEVERITY AESEVN VARORD `ARM A` `ARM B` `ARM C` `ARM D` 1 AESOC Blood and l… All Pr… Mild 1 1 " 0 (… " 0 (… " 0 (… " 0 (… 2 AESOC Cardiac dis… All Pr… Mild 1 1 " 0 (… " 0 (… " 0 (… " 2 (… 3 AESOC Congenital,… All Pr… Mild 1 1 " 0 (… " 1 (… " 0 (… " 0 (… 4 AESOC Ear and lab… All Pr… Mild 1 1 " 0 (… " 0 (… " 0 (… " 0 (… 5 AESOC Endocrine d… All Pr… Mild 1 1 " 0 (… " 0 (… " 1 (… " 0 (… 6 AESOC Gastrointes… All Pr… Mild 1 1 " 0 (… " 4 (… " 0 (… " 2 (… 7 AESOC General dis… All Pr… Mild 1 1 " 2 (… " 0 (… " 3 (… " 2 (… 8 AESOC Infections … All Pr… Mild 1 1 " 7 (… " 7 (… " 6 (… " 6 (… 9 AESOC Injury, poi… All Pr… Mild 1 1 " 0 (… " 0 (… " 0 (… " 1 (… 10 AESOC Investigati… All Pr… Mild 1 1 " 4 (… " 1 (… " 2 (… " 5 (… # ℹ 460 more rows # ℹ Use `print(n = ...)` to see more rows Sort combined rows proc_sort: input data set 470 rows and 10 columns by: AESOC VARORD AEDECOD AESEVN keep: VAR AESOC AEDECOD SEVERITY AESEVN VARORD ARM A ARM B ARM C ARM D order: a a a a output data set 470 rows and 10 columns # A tibble: 470 × 10 VAR AESOC AEDECOD SEVERITY AESEVN VARORD `ARM A` `ARM B` `ARM C` `ARM D` 1 All Adverse… "All P… -1 0 2 All Adverse… "All P… 0 0 3 AESEV All Adverse… "All P… Mild 1 0 " 27 (… " 24 (… " 29 (… " 31 (… 4 AESEV All Adverse… "All P… Moderate 2 0 " 10 (… " 6 (… " 7 (… " 9 (… 5 AESEV All Adverse… "All P… Severe 3 0 " 0 (… " 2 (… " 0 (… " 0 (… 6 Blood and l… "All P… -1 1 7 Blood and l… "All P… 0 1 8 AESOC Blood and l… "All P… Mild 1 1 " 0 (… " 0 (… " 0 (… " 0 (… 9 AESOC Blood and l… "All P… Moderate 2 1 " 0 (… " 0 (… " 1 (… " 0 (… 10 AESOC Blood and l… "All P… Severe 3 1 " 0 (… " 0 (… " 0 (… " 0 (… # ℹ 460 more rows # ℹ Use `print(n = ...)` to see more rows Create stub and paging. datastep: columns increased from 10 to 12 # A tibble: 470 × 12 VAR AESOC AEDECOD SEVERITY AESEVN VARORD `ARM A` `ARM B` `ARM C` `ARM D` RWNM 1 "All … All … "All P… -1 0 1 2 " Al… All … "All P… 0 0 2 3 " … All … "All P… Mild 1 0 " 27 (… " 24 (… " 29 (… " 31 (… 3 4 " … All … "All P… Moderate 2 0 " 10 (… " 6 (… " 7 (… " 9 (… 4 5 " … All … "All P… Severe 3 0 " 0 (… " 2 (… " 0 (… " 0 (… 5 6 "Bloo… Bloo… "All P… -1 1 6 7 " Al… Bloo… "All P… 0 1 7 8 " … Bloo… "All P… Mild 1 1 " 0 (… " 0 (… " 0 (… " 0 (… 8 9 " … Bloo… "All P… Moderate 2 1 " 0 (… " 0 (… " 1 (… " 0 (… 9 10 " … Bloo… "All P… Severe 3 1 " 0 (… " 0 (… " 0 (… " 0 (… 10 # ℹ 460 more rows # ℹ 1 more variable: PG # ℹ Use `print(n = ...)` to see more rows ========================================================================= Create and print report ========================================================================= Create table object Create report object Print report # A report specification: 24 pages - file_path: 'C:\Users\dbosa\AppData\Local\Temp\Rtmp4q58ap/example14.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, Protocol: ABC-123 right=Page [pg] of [tpg], Database: 2023-10-01 - title 1: 'Table 5.2.4' - title 2: 'Summary of Treatment-Emergent Adverse Events by MedDRA System Organ Class' - title 3: 'Preferred Term, and Maximum Severity' - title 4: '(Safety Population)' - footnote 1: 'Program: AE_Table.R' - footnote 2: 'Confidential' - footnote 3: '2023-10-14 14:27:04' - content: # A table specification: - data: tibble 'aefinal' 470 rows 12 cols - show_cols: none - use_attributes: all - width: 9 - define: VAR 'System Organ Class Preferred Term Maximum Grade' - define: AEDECOD visible='FALSE' - define: ARM A 'Placebo' - define: ARM B 'Drug A' - define: ARM C 'Drug B' - define: ARM D 'Drug C' - define: PG visible='FALSE' page_break='TRUE' ========================================================================= Clean Up ========================================================================= Close log ========================================================================= Log End Time: 2023-10-14 14:27:06.77316 Log Elapsed Time: 0 00:00:07 ========================================================================= ``` Next: [Example 15: Intext Table](sassy-intext.html)