# Example 14: AE Severity in Rows

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

    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 are 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
       <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
    # ℹ 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`
      <chr> <chr>   <dbl>   <dbl>   <dbl>   <dbl>
    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
       <chr>      <chr> <chr>    <chr>                                           <chr>
     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
       <chr> <chr> <chr> <chr>                                   <chr> <dbl> <dbl> <dbl>
     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
       <chr> <chr> <chr>                                      <chr>  <dbl>  <dbl> <chr>
     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`
       <chr> <chr>                    <chr>  <dbl> <chr> <chr>   <chr>   <chr>   <chr>
     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
       <chr> <chr>               <chr>     <dbl> <chr>   <chr>   <chr>   <chr>   <chr>
     1 AESOC Blood and lymphati… Mild          1 "  0 (… "  0 (… "  0 (… "  0 (… <NA>
     2 AESOC Cardiac disorders   Mild          1 "  0 (… "  0 (… "  0 (… "  2 (… <NA>
     3 AESOC Congenital, famili… Mild          1 "  0 (… "  1 (… "  0 (… "  0 (… <NA>
     4 AESOC Ear and labyrinth … Mild          1 "  0 (… "  0 (… "  0 (… "  0 (… <NA>
     5 AESOC Endocrine disorders Mild          1 "  0 (… "  0 (… "  1 (… "  0 (… <NA>
     6 AESOC Gastrointestinal d… Mild          1 "  0 (… "  4 (… "  0 (… "  2 (… <NA>
     7 AESOC General disorders … Mild          1 "  2 (… "  0 (… "  3 (… "  2 (… <NA>
     8 AESOC Infections and inf… Mild          1 "  7 (… "  7 (… "  6 (… "  6 (… <NA>
     9 AESOC Injury, poisoning … Mild          1 "  0 (… "  0 (… "  0 (… "  1 (… <NA>
    10 AESOC Investigations      Mild          1 "  4 (… "  1 (… "  2 (… "  5 (… <NA>
    # ℹ 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
       <chr> <chr>   <chr> <chr>                             <chr>    <dbl> <dbl>
     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
       <chr>                                      <chr>
     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
       <chr> <chr>   <chr>                             <chr>     <dbl> <chr>
     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`
       <chr>   <chr>                  <chr>  <dbl> <chr> <chr>   <chr>   <chr>   <chr>
     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
       <chr>  <chr>   <chr>     <dbl> <chr> <chr>   <chr>   <chr>   <chr>   <chr>  <dbl>
     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
       <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 5

    # A tibble: 12 × 5
       BY    VAR   CNTPCT        SEVERITY VARORD
       <chr> <chr> <chr>         <chr>     <dbl>
     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`
      <chr> <chr>     <dbl> <chr>  <chr>         <chr>         <chr>         <chr>
    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
      <chr> <chr>     <dbl> <chr>         <chr>         <chr>      <chr>   <chr> <chr>
    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`
       <chr> <chr>        <chr>   <chr>     <dbl>  <dbl> <chr>   <chr>   <chr>   <chr>
     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
       <chr>                                                <chr>           <dbl>  <dbl>
     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
       <chr>                                      <chr>                <dbl>  <dbl>
     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`
       <chr> <chr>        <chr>   <chr>     <dbl>  <dbl> <chr>   <chr>   <chr>   <chr>
     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`
       <chr> <chr>        <chr>   <chr>     <dbl>  <dbl> <chr>   <chr>   <chr>   <chr>
     1 <NA>  All Adverse… "All P… <NA>         -1      0  <NA>    <NA>    <NA>    <NA>
     2 <NA>  All Adverse… "All P… <NA>          0      0  <NA>    <NA>    <NA>    <NA>
     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 <NA>  Blood and l… "All P… <NA>         -1      1  <NA>    <NA>    <NA>    <NA>
     7 <NA>  Blood and l… "All P… <NA>          0      1  <NA>    <NA>    <NA>    <NA>
     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
       <chr>  <chr> <chr>   <chr>     <dbl>  <dbl> <chr>   <chr>   <chr>   <chr>   <dbl>
     1 "All … All … "All P… <NA>         -1      0  <NA>    <NA>    <NA>    <NA>       1
     2 "  Al… All … "All P… <NA>          0      0  <NA>    <NA>    <NA>    <NA>       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… <NA>         -1      1  <NA>    <NA>    <NA>    <NA>       6
     7 "  Al… Bloo… "All P… <NA>          0      1  <NA>    <NA>    <NA>    <NA>       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 <dbl>
    # ℹ 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