Program

The following example is an adverse events program. The program demonstrates how multiple frequency tables can be combined into a single report. This example also shows how a wide report can be wrapped horizontally using the page_wrap feature of the reporter package.

library(sassy)
library(procs)

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, "example2.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) 

# Load data into workspace
lib_load(sdtm) 

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, "example2.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("Remove library from workspace")
lib_unload(sdtm)

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 output:

Log

And here is the log:

=========================================================================
Log Path: C:/Users/dbosa/AppData/Local/Temp/RtmpKQddL7/log/example2.log
Program Path: C:/Projects/Archytas/Demo/example2.R
Working Directory: C:/Projects/Archytas/Demo
User Name: dbosa
R Version: 4.2.1 (2022-06-23 ucrt)
Machine: SOCRATES x86-64
Operating System: Windows 10 x64 build 19044
Base Packages: stats graphics grDevices utils datasets methods base Other
Packages: tidylog_1.0.2 procs_0.0.9007 reporter_1.3.7 libr_1.2.6 fmtr_1.5.9
logr_1.3.3 common_1.0.5 sassy_1.0.8
Log Start Time: 2022-10-15 20:24:55
=========================================================================

=========================================================================
Prepare Data
=========================================================================

# library 'sdtm': 8 items
- attributes: csv not loaded
- path: ./data
- items:
  Name Extension Rows Cols     Size
1   AE       csv  150   27  88.2 Kb
2   DA       csv 3587   18   528 Kb
3   DM       csv   87   24  45.3 Kb
4   DS       csv  174    9  33.8 Kb
5   EX       csv   84   11  26.1 Kb
6   IE       csv    2   14  13.1 Kb
7   SV       csv  685   10  70.1 Kb
8   VS       csv 3358   17 467.2 Kb
         LastModified
1 2020-09-18 14:30:23
2 2020-09-18 14:30:23
3 2020-09-18 14:30:23
4 2022-09-26 16:54:16
5 2020-09-18 14:30:23
6 2020-09-18 14:30:23
7 2020-09-18 14:30:24
8 2020-09-18 14:30:24

lib_load: library 'sdtm' loaded

Filter DM data

datastep: columns decreased from 24 to 3

# A tibble: 85 × 3
   USUBJID    ARM   ARMCD
   <chr>      <chr> <chr>
 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    
# … with 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
           view: TRUE
           output: 1 datasets

# A tibble: 1 × 6
  VAR   STAT  `ARM A` `ARM B` `ARM C`
  <chr> <chr>   <dbl>   <dbl>   <dbl>
1 ARM   CNT        20      21      21
# … with 1 more variable: `ARM D` <dbl>
# ℹ Use `colnames()` to see all variable names

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
   <chr>   <chr> <chr>  <dbl> <chr> <chr>  
 1 ABC-01… ARM D MODE…      2 Inve… BLOOD …
 2 ABC-01… ARM D MODE…      2 Inve… BLOOD …
 3 ABC-01… ARM D MILD       1 Musc… MUSCUL…
 4 ABC-01… ARM D MILD       1 Nerv… HEADAC…
 5 ABC-01… ARM D MODE…      2 Inve… LABORA…
 6 ABC-01… ARM B MILD       1 Resp… UPPER …
 7 ABC-01… ARM B MILD       1 Skin… RASH   
 8 ABC-01… ARM A MILD       1 Nerv… HEADAC…
 9 ABC-01… ARM A MILD       1 Nerv… HEADAC…
10 ABC-01… ARM A MILD       1 Gene… INFLUE…
# … with 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
   <chr> <chr> <chr> <chr>      <chr> <dbl>
 1 ARM A AESOC AESEV Blood and… MILD     37
 2 ARM A AESOC AESEV Blood and… MODE…    37
 3 ARM A AESOC AESEV Blood and… SEVE…    37
 4 ARM A AESOC AESEV Cardiac d… MILD     37
 5 ARM A AESOC AESEV Cardiac d… MODE…    37
 6 ARM A AESOC AESEV Cardiac d… SEVE…    37
 7 ARM A AESOC AESEV Congenita… MILD     37
 8 ARM A AESOC AESEV Congenita… MODE…    37
 9 ARM A AESOC AESEV Congenita… SEVE…    37
10 ARM A AESOC AESEV Ear and l… MILD     37
# … with 230 more rows, and 2 more
#   variables: CNT <dbl>, PCT <dbl>
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

Combine columns for SOC

datastep: columns decreased from 8 to 7

# A tibble: 240 × 7
   BY    VAR   CAT       CAT2      N VARORD
   <chr> <chr> <chr>     <chr> <dbl>  <dbl>
 1 ARM A AESOC Blood an… Mild     37      1
 2 ARM A AESOC Blood an… Mode…    37      1
 3 ARM A AESOC Blood an… Seve…    37      1
 4 ARM A AESOC Cardiac … Mild     37      1
 5 ARM A AESOC Cardiac … Mode…    37      1
 6 ARM A AESOC Cardiac … Seve…    37      1
 7 ARM A AESOC Congenit… Mild     37      1
 8 ARM A AESOC Congenit… Mode…    37      1
 9 ARM A AESOC Congenit… Seve…    37      1
10 ARM A AESOC Ear and … Mild     37      1
# … with 230 more rows, and 1 more
#   variable: CNTPCT <chr>
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

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…¹ ARM A…²
   <chr> <chr>  <dbl> <chr> <chr>   <chr>  
 1 AESOC Bloo…      1 CNTP… "  0 (… "  0 (…
 2 AESOC Card…      1 CNTP… "  0 (… "  0 (…
 3 AESOC Cong…      1 CNTP… "  0 (… "  0 (…
 4 AESOC Ear …      1 CNTP… "  0 (… "  0 (…
 5 AESOC Endo…      1 CNTP… "  0 (… "  0 (…
 6 AESOC Gast…      1 CNTP… "  0 (… "  1 (…
 7 AESOC Gene…      1 CNTP… "  2 (… "  0 (…
 8 AESOC Infe…      1 CNTP… "  7 (… "  5 (…
 9 AESOC Inju…      1 CNTP… "  0 (… "  0 (…
10 AESOC Inve…      1 CNTP… "  4 (… "  2 (…
11 AESOC Meta…      1 CNTP… "  0 (… "  0 (…
12 AESOC Musc…      1 CNTP… "  3 (… "  0 (…
13 AESOC Neop…      1 CNTP… "  0 (… "  0 (…
14 AESOC Nerv…      1 CNTP… "  7 (… "  0 (…
15 AESOC Psyc…      1 CNTP… "  0 (… "  1 (…
16 AESOC Rena…      1 CNTP… "  1 (… "  0 (…
17 AESOC Resp…      1 CNTP… "  2 (… "  1 (…
18 AESOC Skin…      1 CNTP… "  1 (… "  0 (…
19 AESOC Surg…      1 CNTP… "  0 (… "  0 (…
20 AESOC Vasc…      1 CNTP… "  0 (… "  0 (…
# … with 10 more variables:
#   `ARM A.Severe` <chr>,
#   `ARM B.Mild` <chr>,
#   `ARM B.Moderate` <chr>,
#   `ARM B.Severe` <chr>,
#   `ARM C.Mild` <chr>,
#   `ARM C.Moderate` <chr>, …
# ℹ Use `colnames()` to see all variable names

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
   <chr> <chr>   <chr> <chr>    <chr> <dbl>
 1 ARM A AEDECOD AESEV ANXIETY  MILD      0
 2 ARM A AEDECOD AESEV ANXIETY  MODE…     0
 3 ARM A AEDECOD AESEV ANXIETY  SEVE…     0
 4 ARM A AEDECOD AESEV APPLICA… MILD      0
 5 ARM A AEDECOD AESEV APPLICA… MODE…     0
 6 ARM A AEDECOD AESEV APPLICA… SEVE…     0
 7 ARM A AEDECOD AESEV APPLICA… MILD      0
 8 ARM A AEDECOD AESEV APPLICA… MODE…     0
 9 ARM A AEDECOD AESEV APPLICA… SEVE…     0
10 ARM A AEDECOD AESEV BACK PA… MILD      2
# … with 866 more rows, and 1 more
#   variable: PCT <dbl>
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

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
           nodupkey: TRUE
           output data set 73 rows and 2 columns

# A tibble: 73 × 2
   AESOC                            AEDECOD
   <chr>                            <chr>  
 1 Blood and lymphatic system diso… NEUTRO…
 2 Cardiac disorders                PALPIT…
 3 Cardiac disorders                SINUS …
 4 Congenital, familial and geneti… 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…
# … with 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
   <chr> <chr>   <chr>  <chr>  <dbl> <chr> 
 1 ARM A AEDECOD ANXIE… Mild       2 "  0 …
 2 ARM A AEDECOD ANXIE… Mode…      2 "  0 …
 3 ARM A AEDECOD ANXIE… Seve…      2 "  0 …
 4 ARM A AEDECOD APPLI… Mild       2 "  0 …
 5 ARM A AEDECOD APPLI… Mode…      2 "  0 …
 6 ARM A AEDECOD APPLI… Seve…      2 "  0 …
 7 ARM A AEDECOD APPLI… Mild       2 "  0 …
 8 ARM A AEDECOD APPLI… Mode…      2 "  0 …
 9 ARM A AEDECOD APPLI… Seve…      2 "  0 …
10 ARM A AEDECOD BACK … Mild       2 "  2 …
# … with 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…¹ ARM A…²
   <chr> <chr>  <dbl> <chr> <chr>   <chr>  
 1 AEDE… ANXI…      2 CNTP… "  0 (… "  0 (…
 2 AEDE… APPL…      2 CNTP… "  0 (… "  0 (…
 3 AEDE… APPL…      2 CNTP… "  0 (… "  0 (…
 4 AEDE… BACK…      2 CNTP… "  2 (… "  0 (…
 5 AEDE… BASA…      2 CNTP… "  0 (… "  0 (…
 6 AEDE… BLOO…      2 CNTP… "  0 (… "  0 (…
 7 AEDE… BLOO…      2 CNTP… "  0 (… "  0 (…
 8 AEDE… BLOO…      2 CNTP… "  0 (… "  1 (…
 9 AEDE… BLOO…      2 CNTP… "  1 (… "  1 (…
10 AEDE… BLOO…      2 CNTP… "  0 (… "  0 (…
# … with 63 more rows, 10 more variables:
#   `ARM A.Severe` <chr>,
#   `ARM B.Mild` <chr>,
#   `ARM B.Moderate` <chr>,
#   `ARM B.Severe` <chr>,
#   `ARM C.Mild` <chr>,
#   `ARM C.Moderate` <chr>, …
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

Join in SOC

datastep: columns increased from 16 to 17

# A tibble: 73 × 17
   VAR   CAT2  VARORD NAME  ARM A…¹ ARM A…²
   <chr> <chr>  <dbl> <chr> <chr>   <chr>  
 1 AEDE… Anxi…      2 CNTP… "  0 (… "  0 (…
 2 AEDE… Appl…      2 CNTP… "  0 (… "  0 (…
 3 AEDE… Appl…      2 CNTP… "  0 (… "  0 (…
 4 AEDE… Back…      2 CNTP… "  2 (… "  0 (…
 5 AEDE… Basa…      2 CNTP… "  0 (… "  0 (…
 6 AEDE… Bloo…      2 CNTP… "  0 (… "  0 (…
 7 AEDE… Bloo…      2 CNTP… "  0 (… "  0 (…
 8 AEDE… Bloo…      2 CNTP… "  0 (… "  1 (…
 9 AEDE… Bloo…      2 CNTP… "  1 (… "  1 (…
10 AEDE… Bloo…      2 CNTP… "  0 (… "  0 (…
# … with 63 more rows, 11 more variables:
#   `ARM A.Severe` <chr>,
#   `ARM B.Mild` <chr>,
#   `ARM B.Moderate` <chr>,
#   `ARM B.Severe` <chr>,
#   `ARM C.Mild` <chr>,
#   `ARM C.Moderate` <chr>, …
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

Stack SOC and PT counts

datastep: columns started with 16 and ended with 16

# A tibble: 93 × 16
   VAR   CAT      CAT2  VARORD ARM A…¹ ARM A…² ARM A…³ ARM B…⁴ ARM B…⁵ ARM B…⁶ ARM C…⁷ ARM C…⁸
   <chr> <chr>    <chr>  <dbl> <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>  
 1 AESOC Blood a… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  1 (…
 2 AESOC Cardiac… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (…
 3 AESOC Congeni… <NA>       1 "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (… "  0 (…
 4 AESOC Ear and… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (…
 5 AESOC Endocri… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  1 (… "  0 (…
 6 AESOC Gastroi… <NA>       1 "  0 (… "  1 (… "  0 (… "  4 (… "  1 (… "  0 (… "  0 (… "  0 (…
 7 AESOC General… <NA>       1 "  2 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  3 (… "  0 (…
 8 AESOC Infecti… <NA>       1 "  7 (… "  5 (… "  0 (… "  7 (… "  1 (… "  0 (… "  6 (… "  3 (…
 9 AESOC Injury,… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  1 (…
10 AESOC Investi… <NA>       1 "  4 (… "  2 (… "  0 (… "  1 (… "  0 (… "  0 (… "  2 (… "  1 (…
# … with 83 more rows, 4 more variables: `ARM C.Severe` <chr>, `ARM D.Mild` <chr>,
#   `ARM D.Moderate` <chr>, `ARM D.Severe` <chr>, and abbreviated variable names
#   ¹​`ARM A.Mild`, ²​`ARM A.Moderate`, ³​`ARM A.Severe`, ⁴​`ARM B.Mild`, ⁵​`ARM B.Moderate`,
#   ⁶​`ARM B.Severe`, ⁷​`ARM C.Mild`, ⁸​`ARM C.Moderate`
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

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
           nodupkey: FALSE
           output data set 93 rows and 16 columns

# A tibble: 93 × 16
   VAR     CAT    CAT2  VARORD ARM A…¹ ARM A…² ARM A…³ ARM B…⁴ ARM B…⁵ ARM B…⁶ ARM C…⁷ ARM C…⁸
   <chr>   <chr>  <chr>  <dbl> <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>  
 1 AESOC   Blood… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  1 (…
 2 AEDECOD Blood… Neut…      2 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  1 (…
 3 AESOC   Cardi… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (…
 4 AEDECOD Cardi… Palp…      2 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (…
 5 AEDECOD Cardi… Sinu…      2 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (…
 6 AESOC   Conge… <NA>       1 "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (… "  0 (…
 7 AEDECOD Conge… Derm…      2 "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (… "  0 (…
 8 AESOC   Ear a… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (…
 9 AEDECOD Ear a… Vert…      2 "  0 (… "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (…
10 AESOC   Endoc… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  1 (… "  0 (…
# … with 83 more rows, 4 more variables: `ARM C.Severe` <chr>, `ARM D.Mild` <chr>,
#   `ARM D.Moderate` <chr>, `ARM D.Severe` <chr>, and abbreviated variable names
#   ¹​`ARM A.Mild`, ²​`ARM A.Moderate`, ³​`ARM A.Severe`, ⁴​`ARM B.Mild`, ⁵​`ARM B.Moderate`,
#   ⁶​`ARM B.Severe`, ⁷​`ARM C.Mild`, ⁸​`ARM C.Moderate`
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

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
   <chr> <chr> <chr>    <dbl> <dbl> <dbl>
 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       
   <chr> <chr> <chr>    <chr>        
 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…¹ ARM A…² ARM A…³ ARM B…⁴ ARM B…⁵ ARM B…⁶ ARM C…⁷ ARM C…⁸ ARM C…⁹ ARM D…˟
  <chr> <chr>  <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>  
1 AESEV CNTPCT " 27 (… " 10 (… "  0 (… " 24 (… "  6 (… "  2 (… " 29 (… "  7 (… "  0 (… " 31 (…
# … with 2 more variables: `ARM D.Moderate` <chr>, `ARM D.Severe` <chr>, and abbreviated
#   variable names ¹​`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`
# ℹ Use `colnames()` to see all variable names

=========================================================================
Create final data frame
=========================================================================

datastep: columns increased from 14 to 16

# A tibble: 94 × 16
   VAR     CAT    CAT2  VARORD ARM A…¹ ARM A…² ARM A…³ ARM B…⁴ ARM B…⁵ ARM B…⁶ ARM C…⁷ ARM C…⁸
   <chr>   <chr>  <chr>  <dbl> <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>  
 1 AESEV   All A… <NA>      NA " 27 (… " 10 (… "  0 (… " 24 (… "  6 (… "  2 (… " 29 (… "  7 (…
 2 AESOC   Blood… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  1 (…
 3 AEDECOD Blood… Neut…      2 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  1 (…
 4 AESOC   Cardi… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (…
 5 AEDECOD Cardi… Palp…      2 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (…
 6 AEDECOD Cardi… Sinu…      2 "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (… "  0 (…
 7 AESOC   Conge… <NA>       1 "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (… "  0 (…
 8 AEDECOD Conge… Derm…      2 "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (… "  0 (…
 9 AESOC   Ear a… <NA>       1 "  0 (… "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (…
10 AEDECOD Ear a… Vert…      2 "  0 (… "  0 (… "  0 (… "  0 (… "  1 (… "  0 (… "  0 (… "  0 (…
# … with 84 more rows, 4 more variables: `ARM C.Severe` <chr>, `ARM D.Mild` <chr>,
#   `ARM D.Moderate` <chr>, `ARM D.Severe` <chr>, and abbreviated variable names
#   ¹​`ARM A.Mild`, ²​`ARM A.Moderate`, ³​`ARM A.Severe`, ⁴​`ARM B.Mild`, ⁵​`ARM B.Moderate`,
#   ⁶​`ARM B.Severe`, ⁷​`ARM C.Mild`, ⁸​`ARM C.Moderate`
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

=========================================================================
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\RtmpKQddL7/example2.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=2022-10-15 20:25:00 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'

lib_unload: library 'sdtm' unloaded

Close log

=========================================================================
Log End Time: 2022-10-15 20:25:01
Log Elapsed Time: 0 00:00:06
=========================================================================