The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Example 2: Adverse Events

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
=========================================================================

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.