Program

The following example is an disposition table. The report features extensive data preparation using the procs data manipulation functions. The example also shows how to create a stub column with summary statistics on all levels.

library(sassy)
library(procs)
library(stringr)

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

# Get data
dir <- system.file("extdata", package = "sassy")



# Load and Prepare Data ---------------------------------------------------

sep("Prepare Data")

put("Define data library")
libname(sdtm, dir, "csv") 

put("Loads data into workspace")
lib_load(sdtm)

put("Prepare DM data")
datastep(sdtm.DM, keep = v(USUBJID, ARM), 
         where = expression(ARM != "SCREEN FAILURE"), {}) -> dm_mod

put("Prepare DS data")
datastep(sdtm.DS, keep = v(USUBJID, DSTERM, DSDECOD, DSCAT), 
         where = expression(DSCAT != "PROTOCOL MILESTONE"), {}) -> ds_mod

put("Join DM with DS to get ARMs on DS") 
datastep(dm_mod, merge = ds_mod, merge_by = USUBJID, {}) -> dmds 

put("Change ARM to factor to assist with sparse data")
dmds$ARM <- factor(dmds$ARM, levels = c("ARM A", "ARM B", "ARM C", "ARM D"))


put("Get ARM population counts")
proc_freq(dm_mod, tables = ARM, output = long, 
          options = v(nonobs, nopercent)) -> arm_pop

# Prepare formats ---------------------------------------------------------

# Completed Study
complete_fmt <- value(condition(x == "SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS",
                                str_to_title("SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS")),
                      condition(x == "SUBJECT COMPLETED ALL VISITS BUT WITH MAJOR PROTOCOL VIOLATIONS",
                                str_to_title("SUBJECT COMPLETED ALL VISITS BUT WITH MAJOR PROTOCOL VIOLATIONS")))

# Subject Non-compliance
noncomp_fmt <- value(condition(x == "NON-COMPLIANCE WITH STUDY DRUG",
                               str_to_title("NON-COMPLIANCE WITH STUDY DRUG")))

# Early Termination
term_fmt <- value(condition(x == "LACK OF EFFICACY",
                            str_to_title("LACK OF EFFICACY")),
                  condition(str_detect(x, "LOST"),
                            str_to_title("LOST TO FOLLOW UP")),
                  condition(TRUE, str_to_title("LACK OF EFFICACY")))

# Group labels
group_fmt <- value(condition(x == "COMPLETED", "Subjects who Completed Study"),
                   condition(x == "NONCOMPLIANCE", "Subjects terminated due to non-compliance"),
                   condition(x == "OTHER", "Subjects who terminated early"))


# Disposition Groups ------------------------------------------------------

put("Create vector of final dataframe columns")
cols <- v(group, cat, catseq, `ARM A`, `ARM B`, `ARM C`, `ARM D`) |> put()

put("Get group counts")
proc_freq(dmds, tables = DSDECOD, by = ARM) |> 
  datastep(keep = v(BY, CAT, CNTPCT), {
    
    CNTPCT <- fmt_cnt_pct(CNT, arm_pop[[BY]])
     
  }) |> 
  proc_transpose(var = CNTPCT, by = CAT, id = BY) |> 
  datastep(keep = cols,
    {
    
    group <- ifelse(CAT == "NON-COMPLIANCE WITH STUDY DRUG", "NONCOMPLIANCE", CAT)
    cat = NA
    catseq = 1
    
  }) -> grps


# Disposition Subgroups ----------------------------------------------------

put("Pull out subjects who completed study.")
datastep(dmds, where = expression(DSDECOD == "COMPLETED"),
         {
           TERMDECOD <- fapply(DSTERM, complete_fmt)
           
         }) |> 
  proc_freq(tables = v(DSDECOD * TERMDECOD), by = ARM) |> 
  datastep(keep = v(BY, CAT1, CAT2, CNTPCT),
    {
    
      CNTPCT <- fmt_cnt_pct(CNT, arm_pop[[BY]])
    
    }) |> 
  proc_transpose(var = CNTPCT, by = v(CAT1, CAT2), id = BY) |> 
  datastep(keep = cols,
    {
      group = CAT1
      cat = CAT2
      catseq = 2
    }) -> cmplt

put("Pull out subjects who were non-compliant")
datastep(dmds, where = expression(DSDECOD == "NON-COMPLIANCE WITH STUDY DRUG"),
         {
           TERMDECOD <- fapply(DSTERM, noncomp_fmt)
           
         }) |> 
  proc_freq(tables = v(DSDECOD * TERMDECOD), by = ARM) |> 
  datastep(keep = v(BY, CAT1, CAT2, CNTPCT),
           {
             
             CNTPCT <- fmt_cnt_pct(CNT, arm_pop[[BY]])
             
           }) |> 
  proc_transpose(var = CNTPCT, by = v(CAT1, CAT2), id = BY) |> 
  datastep(keep = cols,
           {
             group = "NONCOMPLIANCE"
             cat = CAT2
             catseq = 2
           }) -> noncompl


put("Pull out subjects who terminated early")
datastep(dmds, where = expression(DSDECOD == "OTHER"),
         {
           TERMDECOD <- fapply(DSTERM, term_fmt)
           
         }) |> 
  proc_freq(tables = v(DSDECOD * TERMDECOD), by = ARM) |> 
  datastep(keep = v(BY, CAT1, CAT2, CNTPCT),
           {
             
             CNTPCT <- fmt_cnt_pct(CNT, arm_pop[[BY]])
             
           }) |> 
  proc_transpose(var = CNTPCT, by = v(CAT1, CAT2), id = BY) |> 
  datastep(keep = cols,
           {
             group = "OTHER"
             cat = CAT2
             catseq = 2
           }) -> earlyterm


put("Combine blocks into final data frame")
datastep(grps, set = list(cmplt, noncompl, earlyterm), 
    {
      lblind <- ifelse(is.na(cat), TRUE, FALSE)
    }) |> 
  proc_sort(by = v(group, catseq, cat)) -> final


# Report ------------------------------------------------------------------

sep("Create and print report")

# Create Table
tbl <- create_table(final, first_row_blank = TRUE, 
                    borders = "all", width = 8.5, header_bold = TRUE) |> 
  column_defaults(from = `ARM A`, to = `ARM D`, 
                  align = "center", width = 1) |> 
  stub(vars = v(group, cat), "Completion Status", 
       style = cell_style(bold = TRUE, indicator = "lblind")) |> 
  define(group, blank_after = TRUE, dedupe = TRUE,
         format = group_fmt) |>
  define(cat, indent = .5) |>
  define(catseq, visible = FALSE) |> 
  define(`ARM A`, label = "Placebo", n = arm_pop["ARM A"]) |> 
  define(`ARM B`, label = "Drug 50mg", n = arm_pop["ARM B"]) |> 
  define(`ARM C`, label = "Drug 100mg", n = arm_pop["ARM C"]) |> 
  define(`ARM D`, label = "Competitor", n = arm_pop["ARM D"]) |> 
  define(lblind, visible = FALSE) |> 
  titles("Table 5.2.3", "Subject Disposition by Category and Treatment Group",                                                                      
         "Safety Population", bold = TRUE, font_size = 11,
         borders = "outside", blank_row = "none") |> 
  footnotes("Program: DS_Table.R",
            "NOTE: Denominator based on number of non-missing responses.",
            borders = "outside", blank_row = "none") 

pth <- file.path(tmp, "example3.pdf")

rpt <- create_report(pth, output_type = "PDF", font = "Arial") |> 
  set_margins(top = 1, bottom = 1) |> 
  add_content(tbl) 


write_report(rpt)


# Clean Up ----------------------------------------------------------------

# Unload library from workspace
lib_unload(sdtm)

# Close log
log_close()

# Uncomment to view files
# file.show(pth)
# file.show(lf)

Output

Here is the output:

Log

And here is the log:

=========================================================================
Log Path: C:/Users/dbosa/AppData/Local/Temp/Rtmp0IaQyN/log/example3.log
Program Path: C:/packages/Testing/procs/ProcsDisposition.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 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-04 15:26:52.219403
=========================================================================

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

Define data library

# 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-08-07 17:51:40
2   DM       csv   87   24  45.5 Kb 2023-08-07 17:51:40
3   DS       csv  174    9  34.1 Kb 2023-08-07 17:51:40
4   EX       csv   84   11  26.4 Kb 2023-08-07 17:51:40
5   IE       csv    2   14  13.4 Kb 2023-08-07 17:51:40
6   SV       csv  685   10  70.3 Kb 2023-08-07 17:51:40
7   VS       csv 3358   17 467.4 Kb 2023-08-07 17:51:40

Loads data into workspace

lib_load: library 'sdtm' loaded

Prepare DM data

datastep: columns decreased from 24 to 2

# A tibble: 85 × 2
   USUBJID    ARM  
   <chr>      <chr>
 1 ABC-01-049 ARM D
 2 ABC-01-050 ARM B
 3 ABC-01-051 ARM A
 4 ABC-01-052 ARM C
 5 ABC-01-053 ARM B
 6 ABC-01-054 ARM D
 7 ABC-01-055 ARM C
 8 ABC-01-056 ARM A
 9 ABC-01-113 ARM D
10 ABC-01-114 ARM B
# ℹ 75 more rows
# ℹ Use `print(n = ...)` to see more rows

Prepare DS data

datastep: columns decreased from 9 to 4

# A tibble: 87 × 4
   USUBJID    DSTERM                                                 DSDECOD                        DSCAT         
   <chr>      <chr>                                                  <chr>                          <chr>         
 1 ABC-01-049 SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSITION E…
 2 ABC-01-050 SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSITION E…
 3 ABC-01-051 SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSITION E…
 4 ABC-01-052 SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSITION E…
 5 ABC-01-053 NON-COMPLIANCE WITH STUDY DRUG                         NON-COMPLIANCE WITH STUDY DRUG DISPOSITION E…
 6 ABC-01-054 SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSITION E…
 7 ABC-01-055 SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSITION E…
 8 ABC-01-056 SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSITION E…
 9 ABC-01-113 SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSITION E…
10 ABC-01-114 SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSITION E…
# ℹ 77 more rows
# ℹ Use `print(n = ...)` to see more rows

Join DM with DS to get ARMs on DS

datastep: columns increased from 2 to 5

# A tibble: 87 × 5
   USUBJID    ARM   DSTERM                                                 DSDECOD                        DSCAT   
   <chr>      <chr> <chr>                                                  <chr>                          <chr>   
 1 ABC-01-049 ARM D SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSI…
 2 ABC-01-050 ARM B SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSI…
 3 ABC-01-051 ARM A SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSI…
 4 ABC-01-052 ARM C SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSI…
 5 ABC-01-053 ARM B NON-COMPLIANCE WITH STUDY DRUG                         NON-COMPLIANCE WITH STUDY DRUG DISPOSI…
 6 ABC-01-054 ARM D SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSI…
 7 ABC-01-055 ARM C SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSI…
 8 ABC-01-056 ARM A SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSI…
 9 ABC-01-113 ARM D SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSI…
10 ABC-01-114 ARM B SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED                      DISPOSI…
# ℹ 77 more rows
# ℹ Use `print(n = ...)` to see more rows

Change ARM to factor to assist with sparse data

Get ARM population counts

proc_freq: input data set 85 rows and 2 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

# A user-defined format: 2 conditions
  Name Type                                                             Expression
1  obj    U          x == "SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS"
2  obj    U x == "SUBJECT COMPLETED ALL VISITS BUT WITH MAJOR PROTOCOL VIOLATIONS"
                                                            Label Order
1          Subject Completed All Visits And Protocol Requirements    NA
2 Subject Completed All Visits But With Major Protocol Violations    NA

# A user-defined format: 1 conditions
  Name Type                            Expression                          Label Order
1  obj    U x == "NON-COMPLIANCE WITH STUDY DRUG" Non-Compliance With Study Drug    NA

# A user-defined format: 3 conditions
  Name Type              Expression             Label Order
1  obj    U x == "LACK OF EFFICACY"  Lack Of Efficacy    NA
2  obj    U   str_detect(x, "LOST") Lost To Follow Up    NA
3  obj    U                    TRUE  Lack Of Efficacy    NA

# A user-defined format: 3 conditions
  Name Type           Expression                                     Label Order
1  obj    U     x == "COMPLETED"              Subjects who Completed Study    NA
2  obj    U x == "NONCOMPLIANCE" Subjects terminated due to non-compliance    NA
3  obj    U         x == "OTHER"             Subjects who terminated early    NA

Create vector of final dataframe columns

group
cat
catseq
ARM A
ARM B
ARM C
ARM D

Get group counts

proc_freq: input data set 87 rows and 5 columns
           tables: DSDECOD
           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 DSDECOD COMPLETED                         20    19 95   
 2 ARM A DSDECOD NON-COMPLIANCE WITH STUDY DRUG    20     0  0   
 3 ARM A DSDECOD OTHER                             20     1  5   
 4 ARM B DSDECOD COMPLETED                         21    17 81.0 
 5 ARM B DSDECOD NON-COMPLIANCE WITH STUDY DRUG    21     1  4.76
 6 ARM B DSDECOD OTHER                             21     3 14.3 
 7 ARM C DSDECOD COMPLETED                         21    16 76.2 
 8 ARM C DSDECOD NON-COMPLIANCE WITH STUDY DRUG    21     0  0   
 9 ARM C DSDECOD OTHER                             21     5 23.8 
10 ARM D DSDECOD COMPLETED                         23    20 87.0 
11 ARM D DSDECOD NON-COMPLIANCE WITH STUDY DRUG    23     0  0   
12 ARM D DSDECOD OTHER                             23     3 13.0 

datastep: columns decreased from 6 to 3

# A tibble: 12 × 3
   BY    CAT                            CNTPCT     
   <chr> <chr>                          <chr>      
 1 ARM A COMPLETED                      19 ( 95.0%)
 2 ARM A NON-COMPLIANCE WITH STUDY DRUG 0 (  0.0%) 
 3 ARM A OTHER                          1 (  5.0%) 
 4 ARM B COMPLETED                      17 ( 81.0%)
 5 ARM B NON-COMPLIANCE WITH STUDY DRUG 1 (  4.8%) 
 6 ARM B OTHER                          3 ( 14.3%) 
 7 ARM C COMPLETED                      16 ( 76.2%)
 8 ARM C NON-COMPLIANCE WITH STUDY DRUG 0 (  0.0%) 
 9 ARM C OTHER                          5 ( 23.8%) 
10 ARM D COMPLETED                      20 ( 87.0%)
11 ARM D NON-COMPLIANCE WITH STUDY DRUG 0 (  0.0%) 
12 ARM D OTHER                          3 ( 13.0%) 

proc_transpose: input data set 12 rows and 3 columns
                by: CAT
                var: CNTPCT
                id: BY
                name: NAME
                output dataset 3 rows and 6 columns

# A tibble: 3 × 6
  CAT                            NAME   `ARM A`     `ARM B`     `ARM C`     `ARM D`    
  <chr>                          <chr>  <chr>       <chr>       <chr>       <chr>      
1 COMPLETED                      CNTPCT 19 ( 95.0%) 17 ( 81.0%) 16 ( 76.2%) 20 ( 87.0%)
2 NON-COMPLIANCE WITH STUDY DRUG CNTPCT 0 (  0.0%)  1 (  4.8%)  0 (  0.0%)  0 (  0.0%) 
3 OTHER                          CNTPCT 1 (  5.0%)  3 ( 14.3%)  5 ( 23.8%)  3 ( 13.0%) 

datastep: columns increased from 6 to 7

# A tibble: 3 × 7
  group         cat   catseq `ARM A`     `ARM B`     `ARM C`     `ARM D`    
  <chr>         <lgl>  <dbl> <chr>       <chr>       <chr>       <chr>      
1 COMPLETED     NA         1 19 ( 95.0%) 17 ( 81.0%) 16 ( 76.2%) 20 ( 87.0%)
2 NONCOMPLIANCE NA         1 0 (  0.0%)  1 (  4.8%)  0 (  0.0%)  0 (  0.0%) 
3 OTHER         NA         1 1 (  5.0%)  3 ( 14.3%)  5 ( 23.8%)  3 ( 13.0%) 

Pull out subjects who completed study.

datastep: columns increased from 5 to 6

# A tibble: 74 × 6
   USUBJID    ARM   DSTERM                                                 DSDECOD   DSCAT             TERMDECOD  
   <chr>      <fct> <chr>                                                  <chr>     <chr>             <chr>      
 1 ABC-01-049 ARM D SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
 2 ABC-01-050 ARM B SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
 3 ABC-01-051 ARM A SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
 4 ABC-01-052 ARM C SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
 5 ABC-01-054 ARM D SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
 6 ABC-01-055 ARM C SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
 7 ABC-01-056 ARM A SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
 8 ABC-01-113 ARM D SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
 9 ABC-01-114 ARM B SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
10 ABC-02-033 ARM C SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS COMPLETED DISPOSITION EVENT Subject Co…
# ℹ 64 more rows
# ℹ Use `print(n = ...)` to see more rows

proc_freq: input data set 74 rows and 6 columns
           tables: DSDECOD * TERMDECOD
           by: ARM
           view: TRUE
           output: 1 datasets

# A tibble: 8 × 8
  BY    VAR1    VAR2      CAT1      CAT2                                                            N   CNT    PCT
  <chr> <chr>   <chr>     <chr>     <chr>                                                       <dbl> <dbl>  <dbl>
1 ARM A DSDECOD TERMDECOD COMPLETED Subject Completed All Visits And Protocol Requirements         19    19 100   
2 ARM A DSDECOD TERMDECOD COMPLETED Subject Completed All Visits But With Major Protocol Viola…    19     0   0   
3 ARM B DSDECOD TERMDECOD COMPLETED Subject Completed All Visits And Protocol Requirements         17    16  94.1 
4 ARM B DSDECOD TERMDECOD COMPLETED Subject Completed All Visits But With Major Protocol Viola…    17     1   5.88
5 ARM C DSDECOD TERMDECOD COMPLETED Subject Completed All Visits And Protocol Requirements         16    16 100   
6 ARM C DSDECOD TERMDECOD COMPLETED Subject Completed All Visits But With Major Protocol Viola…    16     0   0   
7 ARM D DSDECOD TERMDECOD COMPLETED Subject Completed All Visits And Protocol Requirements         20    20 100   
8 ARM D DSDECOD TERMDECOD COMPLETED Subject Completed All Visits But With Major Protocol Viola…    20     0   0   

datastep: columns decreased from 8 to 4

# A tibble: 8 × 4
  BY    CAT1      CAT2                                                            CNTPCT     
  <chr> <chr>     <chr>                                                           <chr>      
1 ARM A COMPLETED Subject Completed All Visits And Protocol Requirements          19 ( 95.0%)
2 ARM A COMPLETED Subject Completed All Visits But With Major Protocol Violations 0 (  0.0%) 
3 ARM B COMPLETED Subject Completed All Visits And Protocol Requirements          16 ( 76.2%)
4 ARM B COMPLETED Subject Completed All Visits But With Major Protocol Violations 1 (  4.8%) 
5 ARM C COMPLETED Subject Completed All Visits And Protocol Requirements          16 ( 76.2%)
6 ARM C COMPLETED Subject Completed All Visits But With Major Protocol Violations 0 (  0.0%) 
7 ARM D COMPLETED Subject Completed All Visits And Protocol Requirements          20 ( 87.0%)
8 ARM D COMPLETED Subject Completed All Visits But With Major Protocol Violations 0 (  0.0%) 

proc_transpose: input data set 8 rows and 4 columns
                by: CAT1 CAT2
                var: CNTPCT
                id: BY
                name: NAME
                output dataset 2 rows and 7 columns

# A tibble: 2 × 7
  CAT1      CAT2                                                            NAME   `ARM A` `ARM B` `ARM C` `ARM D`
  <chr>     <chr>                                                           <chr>  <chr>   <chr>   <chr>   <chr>  
1 COMPLETED Subject Completed All Visits And Protocol Requirements          CNTPCT 19 ( 9… 16 ( 7… 16 ( 7… 20 ( 8…
2 COMPLETED Subject Completed All Visits But With Major Protocol Violations CNTPCT 0 (  0… 1 (  4… 0 (  0… 0 (  0…

datastep: columns started with 7 and ended with 7

# A tibble: 2 × 7
  group     cat                                                             catseq `ARM A` `ARM B` `ARM C` `ARM D`
  <chr>     <chr>                                                            <dbl> <chr>   <chr>   <chr>   <chr>  
1 COMPLETED Subject Completed All Visits And Protocol Requirements               2 19 ( 9… 16 ( 7… 16 ( 7… 20 ( 8…
2 COMPLETED Subject Completed All Visits But With Major Protocol Violations      2 0 (  0… 1 (  4… 0 (  0… 0 (  0…

Pull out subjects who were non-compliant

datastep: columns increased from 5 to 6

# A tibble: 1 × 6
  USUBJID    ARM   DSTERM                         DSDECOD                        DSCAT             TERMDECOD      
  <chr>      <fct> <chr>                          <chr>                          <chr>             <chr>          
1 ABC-01-053 ARM B NON-COMPLIANCE WITH STUDY DRUG NON-COMPLIANCE WITH STUDY DRUG DISPOSITION EVENT Non-Compliance…

proc_freq: input data set 1 rows and 6 columns
           tables: DSDECOD * TERMDECOD
           by: ARM
           view: TRUE
           output: 1 datasets

# A tibble: 4 × 8
  BY    VAR1    VAR2      CAT1                           CAT2                               N   CNT   PCT
  <chr> <chr>   <chr>     <chr>                          <chr>                          <dbl> <dbl> <dbl>
1 ARM A DSDECOD TERMDECOD NON-COMPLIANCE WITH STUDY DRUG Non-Compliance With Study Drug     0     0   NaN
2 ARM B DSDECOD TERMDECOD NON-COMPLIANCE WITH STUDY DRUG Non-Compliance With Study Drug     1     1   100
3 ARM C DSDECOD TERMDECOD NON-COMPLIANCE WITH STUDY DRUG Non-Compliance With Study Drug     0     0   NaN
4 ARM D DSDECOD TERMDECOD NON-COMPLIANCE WITH STUDY DRUG Non-Compliance With Study Drug     0     0   NaN

datastep: columns decreased from 8 to 4

# A tibble: 4 × 4
  BY    CAT1                           CAT2                           CNTPCT    
  <chr> <chr>                          <chr>                          <chr>     
1 ARM A NON-COMPLIANCE WITH STUDY DRUG Non-Compliance With Study Drug 0 (  0.0%)
2 ARM B NON-COMPLIANCE WITH STUDY DRUG Non-Compliance With Study Drug 1 (  4.8%)
3 ARM C NON-COMPLIANCE WITH STUDY DRUG Non-Compliance With Study Drug 0 (  0.0%)
4 ARM D NON-COMPLIANCE WITH STUDY DRUG Non-Compliance With Study Drug 0 (  0.0%)

proc_transpose: input data set 4 rows and 4 columns
                by: CAT1 CAT2
                var: CNTPCT
                id: BY
                name: NAME
                output dataset 1 rows and 7 columns

# A tibble: 1 × 7
  CAT1                           CAT2                           NAME   `ARM A`    `ARM B`    `ARM C`    `ARM D`   
  <chr>                          <chr>                          <chr>  <chr>      <chr>      <chr>      <chr>     
1 NON-COMPLIANCE WITH STUDY DRUG Non-Compliance With Study Drug CNTPCT 0 (  0.0%) 1 (  4.8%) 0 (  0.0%) 0 (  0.0%)

datastep: columns started with 7 and ended with 7

# A tibble: 1 × 7
  group         cat                            catseq `ARM A`    `ARM B`    `ARM C`    `ARM D`   
  <chr>         <chr>                           <dbl> <chr>      <chr>      <chr>      <chr>     
1 NONCOMPLIANCE Non-Compliance With Study Drug      2 0 (  0.0%) 1 (  4.8%) 0 (  0.0%) 0 (  0.0%)

Pull out subjects who terminated early

datastep: columns increased from 5 to 6

# A tibble: 12 × 6
   USUBJID    ARM   DSTERM                                                                 DSDECOD DSCAT TERMDECOD
   <chr>      <fct> <chr>                                                                  <chr>   <chr> <chr>    
 1 ABC-03-005 ARM C LOST OF FOLLOW UP.  CERTIFIED LETTER ASKING ABOUT DRUG RETURN SENT; P… OTHER   DISP… Lost To …
 2 ABC-03-008 ARM D WORSENING OF PSORIASIS AND LACK OF EFFICACY                            OTHER   DISP… Lack Of …
 3 ABC-04-074 ARM C LACK OF EFFICACY                                                       OTHER   DISP… Lack Of …
 4 ABC-04-128 ARM C LOST TO FOLLOW UP                                                      OTHER   DISP… Lost To …
 5 ABC-06-069 ARM A PSORIASIS FLARING/NOT RESPONDING TO DRUG                               OTHER   DISP… Lack Of …
 6 ABC-06-161 ARM C NON  RESPONSE TO DRUG - PRURITIS INTOLERABLE                           OTHER   DISP… Lack Of …
 7 ABC-08-103 ARM B LOST TO FOLLOW UP                                                      OTHER   DISP… Lost To …
 8 ABC-08-105 ARM C MOTHER TERMINALLY ILL                                                  OTHER   DISP… Lack Of …
 9 ABC-08-107 ARM D PATIENT DISSATISFIED                                                   OTHER   DISP… Lack Of …
10 ABC-08-108 ARM B LOST TO FOLLOW UP                                                      OTHER   DISP… Lost To …
11 ABC-09-021 ARM B LOST TO FOLLOW UP                                                      OTHER   DISP… Lost To …
12 ABC-09-022 ARM D LOST TO FOLLOW-UP                                                      OTHER   DISP… Lost To …

proc_freq: input data set 12 rows and 6 columns
           tables: DSDECOD * TERMDECOD
           by: ARM
           view: TRUE
           output: 1 datasets

# A tibble: 8 × 8
  BY    VAR1    VAR2      CAT1  CAT2                  N   CNT   PCT
  <chr> <chr>   <chr>     <chr> <chr>             <dbl> <dbl> <dbl>
1 ARM A DSDECOD TERMDECOD OTHER Lack Of Efficacy      1     1 100  
2 ARM A DSDECOD TERMDECOD OTHER Lost To Follow Up     1     0   0  
3 ARM B DSDECOD TERMDECOD OTHER Lack Of Efficacy      3     0   0  
4 ARM B DSDECOD TERMDECOD OTHER Lost To Follow Up     3     3 100  
5 ARM C DSDECOD TERMDECOD OTHER Lack Of Efficacy      5     3  60  
6 ARM C DSDECOD TERMDECOD OTHER Lost To Follow Up     5     2  40  
7 ARM D DSDECOD TERMDECOD OTHER Lack Of Efficacy      3     2  66.7
8 ARM D DSDECOD TERMDECOD OTHER Lost To Follow Up     3     1  33.3

datastep: columns decreased from 8 to 4

# A tibble: 8 × 4
  BY    CAT1  CAT2              CNTPCT    
  <chr> <chr> <chr>             <chr>     
1 ARM A OTHER Lack Of Efficacy  1 (  5.0%)
2 ARM A OTHER Lost To Follow Up 0 (  0.0%)
3 ARM B OTHER Lack Of Efficacy  0 (  0.0%)
4 ARM B OTHER Lost To Follow Up 3 ( 14.3%)
5 ARM C OTHER Lack Of Efficacy  3 ( 14.3%)
6 ARM C OTHER Lost To Follow Up 2 (  9.5%)
7 ARM D OTHER Lack Of Efficacy  2 (  8.7%)
8 ARM D OTHER Lost To Follow Up 1 (  4.3%)

proc_transpose: input data set 8 rows and 4 columns
                by: CAT1 CAT2
                var: CNTPCT
                id: BY
                name: NAME
                output dataset 2 rows and 7 columns

# A tibble: 2 × 7
  CAT1  CAT2              NAME   `ARM A`    `ARM B`    `ARM C`    `ARM D`   
  <chr> <chr>             <chr>  <chr>      <chr>      <chr>      <chr>     
1 OTHER Lack Of Efficacy  CNTPCT 1 (  5.0%) 0 (  0.0%) 3 ( 14.3%) 2 (  8.7%)
2 OTHER Lost To Follow Up CNTPCT 0 (  0.0%) 3 ( 14.3%) 2 (  9.5%) 1 (  4.3%)

datastep: columns started with 7 and ended with 7

# A tibble: 2 × 7
  group cat               catseq `ARM A`    `ARM B`    `ARM C`    `ARM D`   
  <chr> <chr>              <dbl> <chr>      <chr>      <chr>      <chr>     
1 OTHER Lack Of Efficacy       2 1 (  5.0%) 0 (  0.0%) 3 ( 14.3%) 2 (  8.7%)
2 OTHER Lost To Follow Up      2 0 (  0.0%) 3 ( 14.3%) 2 (  9.5%) 1 (  4.3%)

Combine blocks into final data frame

datastep: columns increased from 7 to 8

# A tibble: 8 × 8
  group         cat                                                  catseq `ARM A` `ARM B` `ARM C` `ARM D` lblind
  <chr>         <chr>                                                 <dbl> <chr>   <chr>   <chr>   <chr>   <lgl> 
1 COMPLETED     <NA>                                                      1 19 ( 9… 17 ( 8… 16 ( 7… 20 ( 8… TRUE  
2 NONCOMPLIANCE <NA>                                                      1 0 (  0… 1 (  4… 0 (  0… 0 (  0… TRUE  
3 OTHER         <NA>                                                      1 1 (  5… 3 ( 14… 5 ( 23… 3 ( 13… TRUE  
4 COMPLETED     Subject Completed All Visits And Protocol Requireme…      2 19 ( 9… 16 ( 7… 16 ( 7… 20 ( 8… FALSE 
5 COMPLETED     Subject Completed All Visits But With Major Protoco…      2 0 (  0… 1 (  4… 0 (  0… 0 (  0… FALSE 
6 NONCOMPLIANCE Non-Compliance With Study Drug                            2 0 (  0… 1 (  4… 0 (  0… 0 (  0… FALSE 
7 OTHER         Lack Of Efficacy                                          2 1 (  5… 0 (  0… 3 ( 14… 2 (  8… FALSE 
8 OTHER         Lost To Follow Up                                         2 0 (  0… 3 ( 14… 2 (  9… 1 (  4… FALSE 

proc_sort: input data set 8 rows and 8 columns
           by: group catseq cat
           keep: group cat catseq ARM A ARM B ARM C ARM D lblind
           order: a a a
           output data set 8 rows and 8 columns

# A tibble: 8 × 8
  group         cat                                                  catseq `ARM A` `ARM B` `ARM C` `ARM D` lblind
  <chr>         <chr>                                                 <dbl> <chr>   <chr>   <chr>   <chr>   <lgl> 
1 COMPLETED     <NA>                                                      1 19 ( 9… 17 ( 8… 16 ( 7… 20 ( 8… TRUE  
2 COMPLETED     Subject Completed All Visits And Protocol Requireme…      2 19 ( 9… 16 ( 7… 16 ( 7… 20 ( 8… FALSE 
3 COMPLETED     Subject Completed All Visits But With Major Protoco…      2 0 (  0… 1 (  4… 0 (  0… 0 (  0… FALSE 
4 NONCOMPLIANCE <NA>                                                      1 0 (  0… 1 (  4… 0 (  0… 0 (  0… TRUE  
5 NONCOMPLIANCE Non-Compliance With Study Drug                            2 0 (  0… 1 (  4… 0 (  0… 0 (  0… FALSE 
6 OTHER         <NA>                                                      1 1 (  5… 3 ( 14… 5 ( 23… 3 ( 13… TRUE  
7 OTHER         Lack Of Efficacy                                          2 1 (  5… 0 (  0… 3 ( 14… 2 (  8… FALSE 
8 OTHER         Lost To Follow Up                                         2 0 (  0… 3 ( 14… 2 (  9… 1 (  4… FALSE 

=========================================================================
Create and print report
=========================================================================

# A report specification: 1 pages
- file_path: 'C:\Users\dbosa\AppData\Local\Temp\Rtmp0IaQyN/example3.pdf'
- output_type: PDF
- units: inches
- orientation: landscape
- margins: top 1 bottom 1 left 1 right 1
- line size/count: 9/41
- content: 
# A table specification:
- data: tibble 'final' 8 rows 8 cols
- show_cols: all
- use_attributes: all
- width: 8.5
- title 1: 'Table 5.2.3'
- title 2: 'Subject Disposition by Category and Treatment Group'
- title 3: 'Safety Population'
- footnote 1: 'Program: DS_Table.R'
- footnote 2: 'NOTE: Denominator based on number of non-missing responses.'
- stub: group cat 'Completion Status' align='left' 
- define: group dedupe='TRUE' 
- define: cat 
- define: catseq visible='FALSE' 
- define: ARM A 'Placebo' 
- define: ARM B 'Drug 50mg' 
- define: ARM C 'Drug 100mg' 
- define: ARM D 'Competitor' 
- define: lblind visible='FALSE' 

lib_sync: synchronized data in library 'sdtm'

lib_unload: library 'sdtm' unloaded

=========================================================================
Log End Time: 2023-09-04 15:26:56.527739
Log Elapsed Time: 0 00:00:04
=========================================================================