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

Example 10: Disposition Table

This example produces a subject disposition table. The report features extensive data preparation using the procs package. The example also shows how to create a stub column with summary rows.

Program

library(sassy)
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, "example10.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("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, "example10.pdf")

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


write_report(rpt)


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

# Close log
log_close()

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

Output

Here is the output report:

Log

Here is the log:

=========================================================================
Log Path: C:/Users/dbosa/AppData/Local/Temp/RtmpEBPgPu/log/example10.log
Program Path: C:/packages/Testing/procs/ProcsDisposition.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:06:05.090672
=========================================================================

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

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 … COMPLE… DISP…
 2 ABC-01-050 SUBJECT COMPLETED ALL … COMPLE… DISP…
 3 ABC-01-051 SUBJECT COMPLETED ALL … COMPLE… DISP…
 4 ABC-01-052 SUBJECT COMPLETED ALL … COMPLE… DISP…
 5 ABC-01-053 NON-COMPLIANCE WITH ST… NON-CO… DISP…
 6 ABC-01-054 SUBJECT COMPLETED ALL … COMPLE… DISP…
 7 ABC-01-055 SUBJECT COMPLETED ALL … COMPLE… DISP…
 8 ABC-01-056 SUBJECT COMPLETED ALL … COMPLE… DISP…
 9 ABC-01-113 SUBJECT COMPLETED ALL … COMPLE… DISP…
10 ABC-01-114 SUBJECT COMPLETED ALL … COMPLE… DISP…
# ℹ 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 COMPLETE… COMPLE… DISP…
 2 ABC-01-050 ARM B SUBJECT COMPLETE… COMPLE… DISP…
 3 ABC-01-051 ARM A SUBJECT COMPLETE… COMPLE… DISP…
 4 ABC-01-052 ARM C SUBJECT COMPLETE… COMPLE… DISP…
 5 ABC-01-053 ARM B NON-COMPLIANCE W… NON-CO… DISP…
 6 ABC-01-054 ARM D SUBJECT COMPLETE… COMPLE… DISP…
 7 ABC-01-055 ARM C SUBJECT COMPLETE… COMPLE… DISP…
 8 ABC-01-056 ARM A SUBJECT COMPLETE… COMPLE… DISP…
 9 ABC-01-113 ARM D SUBJECT COMPLETE… COMPLE… DISP…
10 ABC-01-114 ARM B SUBJECT COMPLETE… COMPLE… DISP…
# ℹ 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
1  obj    U
2  obj    U
                                                              Expression
1          x == "SUBJECT COMPLETED ALL VISITS AND PROTOCOL REQUIREMENTS"
2 x == "SUBJECT COMPLETED ALL VISITS BUT WITH MAJOR PROTOCOL VIOLATIONS"
                                                            Label
1          Subject Completed All Visits And Protocol Requirements
2 Subject Completed All Visits But With Major Protocol Violations
  Order
1    NA
2    NA

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

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

# A user-defined format: 3 conditions
  Name Type           Expression
1  obj    U     x == "COMPLETED"
2  obj    U x == "NONCOMPLIANCE"
3  obj    U         x == "OTHER"
                                      Label Order
1              Subjects who Completed Study    NA
2 Subjects terminated due to non-compliance    NA
3             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 …    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 …    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 …    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 …    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   CNTP… 19 ( 9… 17 ( 8… 16 ( 7… 20 ( 8…
2 NON-COMPLI… CNTP… 0 (  0… 1 (  4… 0 (  0… 0 (  0…
3 OTHER       CNTP… 1 (  5… 3 ( 14… 5 ( 23… 3 ( 13…

datastep: columns increased from 6 to 7

# A tibble: 3 × 7
  group        cat   catseq `ARM A` `ARM B` `ARM C`
  <chr>        <lgl>  <dbl> <chr>   <chr>   <chr>  
1 COMPLETED    NA         1 19 ( 9… 17 ( 8… 16 ( 7…
2 NONCOMPLIAN… NA         1 0 (  0… 1 (  4… 0 (  0…
3 OTHER        NA         1 1 (  5… 3 ( 14… 5 ( 23…
# ℹ 1 more variable: `ARM D` <chr>

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 SUBJEC… COMPLE… DISP… Subject …
 2 ABC-01-050 ARM B SUBJEC… COMPLE… DISP… Subject …
 3 ABC-01-051 ARM A SUBJEC… COMPLE… DISP… Subject …
 4 ABC-01-052 ARM C SUBJEC… COMPLE… DISP… Subject …
 5 ABC-01-054 ARM D SUBJEC… COMPLE… DISP… Subject …
 6 ABC-01-055 ARM C SUBJEC… COMPLE… DISP… Subject …
 7 ABC-01-056 ARM A SUBJEC… COMPLE… DISP… Subject …
 8 ABC-01-113 ARM D SUBJEC… COMPLE… DISP… Subject …
 9 ABC-01-114 ARM B SUBJEC… COMPLE… DISP… Subject …
10 ABC-02-033 ARM C SUBJEC… COMPLE… DISP… Subject …
# ℹ 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 DSDEC… TERM… COMP… Subj…    19    19 100   
2 ARM A DSDEC… TERM… COMP… Subj…    19     0   0   
3 ARM B DSDEC… TERM… COMP… Subj…    17    16  94.1 
4 ARM B DSDEC… TERM… COMP… Subj…    17     1   5.88
5 ARM C DSDEC… TERM… COMP… Subj…    16    16 100   
6 ARM C DSDEC… TERM… COMP… Subj…    16     0   0   
7 ARM D DSDEC… TERM… COMP… Subj…    20    20 100   
8 ARM D DSDEC… TERM… COMP… Subj…    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 Vis… 19 ( …
2 ARM A COMPLETED Subject Completed All Vis… 0 (  …
3 ARM B COMPLETED Subject Completed All Vis… 16 ( …
4 ARM B COMPLETED Subject Completed All Vis… 1 (  …
5 ARM C COMPLETED Subject Completed All Vis… 16 ( …
6 ARM C COMPLETED Subject Completed All Vis… 0 (  …
7 ARM D COMPLETED Subject Completed All Vis… 20 ( …
8 ARM D COMPLETED Subject Completed All Vis… 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 COMP… Subj… CNTP… 19 ( 9… 16 ( 7… 16 ( 7… 20 ( 8…
2 COMP… Subj… CNTP… 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`
  <chr>     <chr>     <dbl> <chr>   <chr>   <chr>  
1 COMPLETED Subject…      2 19 ( 9… 16 ( 7… 16 ( 7…
2 COMPLETED Subject…      2 0 (  0… 1 (  4… 0 (  0…
# ℹ 1 more variable: `ARM D` <chr>

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-COM… NON-CO… DISP… Non-Comp…

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 TERM… NON-… Non-…     0     0   NaN
2 ARM B DSDECOD TERM… NON-… Non-…     1     1   100
3 ARM C DSDECOD TERM… NON-… Non-…     0     0   NaN
4 ARM D DSDECOD TERM… NON-… Non-…     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-… 0 (  …
2 ARM B NON-COMPLIANCE WITH STUDY DRUG Non-… 1 (  …
3 ARM C NON-COMPLIANCE WITH STUDY DRUG Non-… 0 (  …
4 ARM D NON-COMPLIANCE WITH STUDY DRUG Non-… 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-… Non-… CNTP… 0 (  0… 1 (  4… 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`
  <chr>        <chr>  <dbl> <chr>   <chr>   <chr>  
1 NONCOMPLIAN… Non-…      2 0 (  0… 1 (  4… 0 (  0…
# ℹ 1 more variable: `ARM D` <chr>

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 O… OTHER   DISP… Lost To …
 2 ABC-03-008 ARM D WORSEN… OTHER   DISP… Lack Of …
 3 ABC-04-074 ARM C LACK O… OTHER   DISP… Lack Of …
 4 ABC-04-128 ARM C LOST T… OTHER   DISP… Lost To …
 5 ABC-06-069 ARM A PSORIA… OTHER   DISP… Lack Of …
 6 ABC-06-161 ARM C NON  R… OTHER   DISP… Lack Of …
 7 ABC-08-103 ARM B LOST T… OTHER   DISP… Lost To …
 8 ABC-08-105 ARM C MOTHER… OTHER   DISP… Lack Of …
 9 ABC-08-107 ARM D PATIEN… OTHER   DISP… Lack Of …
10 ABC-08-108 ARM B LOST T… OTHER   DISP… Lost To …
11 ABC-09-021 ARM B LOST T… OTHER   DISP… Lost To …
12 ABC-09-022 ARM D LOST T… 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 TERM… OTHER Lack…     1     1 100  
2 ARM A DSDECOD TERM… OTHER Lost…     1     0   0  
3 ARM B DSDECOD TERM… OTHER Lack…     3     0   0  
4 ARM B DSDECOD TERM… OTHER Lost…     3     3 100  
5 ARM C DSDECOD TERM… OTHER Lack…     5     3  60  
6 ARM C DSDECOD TERM… OTHER Lost…     5     2  40  
7 ARM D DSDECOD TERM… OTHER Lack…     3     2  66.7
8 ARM D DSDECOD TERM… OTHER Lost…     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… CNTP… 1 (  5… 0 (  0… 3 ( 14… 2 (  8…
2 OTHER Lost… CNTP… 0 (  0… 3 ( 14… 2 (  9… 1 (  4…

datastep: columns started with 7 and ended with 7

# A tibble: 2 × 7
  group cat          catseq `ARM A` `ARM B` `ARM C`
  <chr> <chr>         <dbl> <chr>   <chr>   <chr>  
1 OTHER Lack Of Eff…      2 1 (  5… 0 (  0… 3 ( 14…
2 OTHER Lost To Fol…      2 0 (  0… 3 ( 14… 2 (  9…
# ℹ 1 more variable: `ARM D` <chr>

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`
  <chr>        <chr>  <dbl> <chr>   <chr>   <chr>  
1 COMPLETED    <NA>       1 19 ( 9… 17 ( 8… 16 ( 7…
2 NONCOMPLIAN… <NA>       1 0 (  0… 1 (  4… 0 (  0…
3 OTHER        <NA>       1 1 (  5… 3 ( 14… 5 ( 23…
4 COMPLETED    Subj…      2 19 ( 9… 16 ( 7… 16 ( 7…
5 COMPLETED    Subj…      2 0 (  0… 1 (  4… 0 (  0…
6 NONCOMPLIAN… Non-…      2 0 (  0… 1 (  4… 0 (  0…
7 OTHER        Lack…      2 1 (  5… 0 (  0… 3 ( 14…
8 OTHER        Lost…      2 0 (  0… 3 ( 14… 2 (  9…
# ℹ 2 more variables: `ARM D` <chr>, lblind <lgl>

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`
  <chr>        <chr>  <dbl> <chr>   <chr>   <chr>  
1 COMPLETED    <NA>       1 19 ( 9… 17 ( 8… 16 ( 7…
2 COMPLETED    Subj…      2 19 ( 9… 16 ( 7… 16 ( 7…
3 COMPLETED    Subj…      2 0 (  0… 1 (  4… 0 (  0…
4 NONCOMPLIAN… <NA>       1 0 (  0… 1 (  4… 0 (  0…
5 NONCOMPLIAN… Non-…      2 0 (  0… 1 (  4… 0 (  0…
6 OTHER        <NA>       1 1 (  5… 3 ( 14… 5 ( 23…
7 OTHER        Lack…      2 1 (  5… 0 (  0… 3 ( 14…
8 OTHER        Lost…      2 0 (  0… 3 ( 14… 2 (  9…
# ℹ 2 more variables: `ARM D` <chr>, lblind <lgl>

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

# A report specification: 1 pages
- file_path: 'C:\Users\dbosa\AppData\Local\Temp\RtmpEBPgPu/example10.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'

=========================================================================
Log End Time: 2023-09-05 22:06:09.329367
Log Elapsed Time: 0 00:00:04
=========================================================================

Next: Example 11: Subject Listing

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