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