TL Catalog
  1. Tables
  2. Exposure
  3. TSIEX03
  • Introduction

  • Index

  • Tables
    • Adverse Events
      • TSFAE01A
      • TSFAE01B
      • TSFAE02
      • TSFAE02A
      • TSFAE03
      • TSFAE03A
      • TSFAE04
      • TSFAE04A
      • TSFAE05
      • TSFAE05A
      • TSFAE06A
      • TSFAE06B
      • TSFAE07A
      • TSFAE07B
      • TSFAE08
      • TSFAE09
      • TSFAE10
      • TSFAE11
      • TSFAE12
      • TSFAE13
      • TSFAE14
      • TSFAE15
      • TSFAE16
      • TSFAE17A
      • TSFAE17B
      • TSFAE17C
      • TSFAE17D
      • TSFAE19A
      • TSFAE19B
      • TSFAE19C
      • TSFAE19D
      • TSFAE20A
      • TSFAE20B
      • TSFAE20C
      • TSFAE21A
      • TSFAE21B
      • TSFAE21C
      • TSFAE21D
      • TSFAE22A
      • TSFAE22B
      • TSFAE22C
      • TSFAE23A
      • TSFAE23B
      • TSFAE23C
      • TSFAE23D
      • TSFAE24A
      • TSFAE24B
      • TSFAE24C
      • TSFAE24D
      • TSFAE24F
      • TSFDTH01
    • Clinical Laboratory Evaluation
      • TSFLAB01
      • TSFLAB01A
      • TSFLAB02
      • TSFLAB02A
      • TSFLAB02B
      • TSFLAB03
      • TSFLAB03A
      • TSFLAB04A
      • TSFLAB04B
      • TSFLAB05
      • TSFLAB06
      • TSFLAB07
    • Demographic
      • TSIDEM01
      • TSIDEM02
      • TSIMH01
    • Disposition of Subjects
      • TSIDS01
      • TSIDS02
      • TSIDS02A
    • Electrocardiograms
      • TSFECG01
      • TSFECG01A
      • TSFECG02
      • TSFECG03
      • TSFECG04
      • TSFECG05
    • Exposure
      • TSIEX01
      • TSIEX02
      • TSIEX03
      • TSIEX04
      • TSIEX06
      • TSIEX07
      • TSIEX08
      • TSIEX09
      • TSIEX10
      • TSIEX11
    • Pharmacokinetics
      • TPK01A
      • TPK01B
      • TPK02
      • TPK03
    • Prior and Concomitant Therapies
      • TSICM01
      • TSICM02
      • TSICM03
      • TSICM04
      • TSICM05
      • TSICM06
      • TSICM07
      • TSICM08
    • Vital Signs and Physical Findings
      • TSFVIT01
      • TSFVIT01A
      • TSFVIT02
      • TSFVIT03
      • TSFVIT04
      • TSFVIT05
      • TSFVIT06
  • Listings
    • Adverse Events
      • LSFAE01
      • LSFAE02
      • LSFAE03
      • LSFAE04
      • LSFAE05
      • LSFAE06A
      • LSFAE06B
      • LSFDTH01
    • Clinical Laboratory Evaluation
      • LSFLAB01
    • Demographic
      • LSIDEM01
      • LSIDEM02
      • LSIMH01
    • Disposition of Subjects
      • LSIDS01
      • LSIDS02
      • LSIDS03
      • LSIDS04
      • LSIDS05
    • Electrocardiograms
      • LSFECG01
      • LSFECG02
    • Exposure
      • LSIEX01
      • LSIEX02
      • LSIEX03
    • Prior and Concomitant Therapies
      • LSICM01
    • Vital Signs and Physical Findings
      • LSFVIT01
      • LSFVIT02

  • Reproducibility

  • Changelog

On this page

  • Output
  • Edit this page
  • Report an issue
  1. Tables
  2. Exposure
  3. TSIEX03

TSIEX03

Study Treatment Administration


Output

  • Preview
Code
# Program Name:              tsiex03.R

# Prep Environment

library(envsetup)
library(tern)
library(dplyr)
library(rtables)
library(junco)

# Define script level parameters:

# - Define output ID and file location

tblid <- "TSIEX03"
fileid <- tblid
tab_titles <- get_titles_from_file(input_path = '../../_data/', tblid)
string_map <- default_str_map


trtvar <- "TRT01A"
popfl <- "SAFFL"

catlevels <- c("1 to <10", "10 to <20", ">=20")

combined_colspan_trt <- TRUE

if (combined_colspan_trt == TRUE) {
  # Set up levels and label for the required combined columns
  add_combo <- add_combo_facet(
    "Combined",
    label = "Combined",
    levels = c("Xanomeline High Dose", "Xanomeline Low Dose")
  )

  # choose if any facets need to be removed - e.g remove the combined column for placebo
  rm_combo_from_placebo <- cond_rm_facets(
    facets = "Combined",
    ancestor_pos = NA,
    value = " ",
    split = "colspan_trt"
  )

  mysplit <- make_split_fun(post = list(add_combo, rm_combo_from_placebo))
}

# Process Data:

# Read in required data
adsl <- pharmaverseadamjnj::adsl %>%
  filter(!!rlang::sym(popfl) == "Y") %>%
  select(USUBJID, all_of(trtvar), all_of(popfl))

# If AVISIT is not present in ADEXSUM than create 'Overall' as the Visit, which is used
# for the filtering AVISIT records if it does exist
adexsum1 <- pharmaverseadamjnj::adexsum %>%
  mutate(VISIT = if (exists("AVISIT")) AVISIT else "Overall") %>%
  filter(PARAMCD == "TNUMDOS" & !is.na(AVAL) & VISIT == "Overall") %>%
  mutate(AVAL1 = AVAL) %>%
  select(STUDYID, USUBJID, PARAMCD, AVAL1, AVALCAT1, starts_with("CRIT"))

adexsum2 <- pharmaverseadamjnj::adexsum %>%
  mutate(VISIT = if (exists("AVISIT")) AVISIT else "Overall") %>%
  filter(PARAMCD == "CUMDOSE" & !is.na(AVAL) & VISIT == "Overall") %>%
  mutate(AVAL2 = AVAL) %>%
  select(STUDYID, USUBJID, PARAMCD, AVAL2)

adexsum <- bind_rows(adexsum1, adexsum2) %>%
  select(STUDYID, USUBJID, PARAMCD, AVAL1, AVAL2, AVALCAT1, starts_with("CRIT"))

adsl$colspan_trt <- factor(
  ifelse(adsl[[trtvar]] == "Placebo", " ", "Active Study Agent"),
  levels = c("Active Study Agent", " ")
)

# join data together
ex <- adexsum %>% inner_join(., adsl, by = c("USUBJID"))

# Keep only columns with some data in which will remove any unwanted CRITy variables
ex <- ex[, colSums(is.na(ex)) < nrow(ex)]

# Work out how many CRITy vars we have left
excritvars <- ex %>%
  select(num_range("CRIT", 1:99))

countcritvars <- length(names(excritvars))

# Drop unwanted levels for all CRITy variables you have remaining in ex and also for AVALCAT1

critlbls <- list()
for (i in 1:countcritvars) {
  variable_name <- paste0("CRIT", i)
  ex[[variable_name]] <- droplevels(ex[[variable_name]])
  critlbls[[i]] <- unique(as.character(ex[[variable_name]][
    !is.na(ex[[variable_name]])
  ]))
}

# drop unwanted levels from AVALCAT1 and assign levels from specified section at the top of script
ex$AVALCAT1 <- droplevels(ex$AVALCAT1)
ex$AVALCAT1 <- factor(ex$AVALCAT1, levels = catlevels)

colspan_trt_map <- create_colspan_map(
  adsl,
  non_active_grp = "Placebo",
  non_active_grp_span_lbl = " ",
  active_grp_span_lbl = "Active Study Agent",
  colspan_var = "colspan_trt",
  trt_var = trtvar
)

# Define layout and build table:

extra_args1 <- list(
  .stats = "count_unique_fraction",
  denom = "n_df"
)

extra_args2 <- list(
  denom = "n_df",
  .stats = "count_unique_fraction"
)

lyt <- rtables::basic_table(
  top_level_section_div = " ",
  show_colcounts = TRUE,
  colcount_format = "N=xx"
) %>%
  split_cols_by(
    "colspan_trt",
    split_fun = trim_levels_to_map(map = colspan_trt_map)
  )

if (combined_colspan_trt == TRUE) {
  lyt <- lyt %>%
    split_cols_by(trtvar, split_fun = mysplit)
} else {
  lyt <- lyt %>%
    split_cols_by(trtvar)
}

lyt <- lyt %>%
  analyze(
    "AVAL1",
    table_names = "AVAL1x",
    var_labels = "Total number of administrations",
    show_labels = "visible",
    indent_mod = 0L,
    afun = function(x) {
      list(
        "N" = rcell(length(x), format = jjcsformat_xx("xx"))
      )
    }
  ) %>%
  analyze(
    "AVAL1",
    nested = TRUE,
    var_labels = "Total number of administrations",
    show_labels = "hidden",
    indent_mod = 2L,
    afun = function(x) {
      list(
        "Mean (SD)" = rcell(
          c(mean(x), sd(x)),
          format = jjcsformat_xx("xx.x (xx.xx)")
        ),
        "Median" = rcell(median(x), format = jjcsformat_xx("xx.x")),
        "Min, max" = rcell(
          c(min(x), max(x)),
          format = jjcsformat_xx("xx., xx.")
        ),
        "Interquartile range" = rcell(
          c(quantile(x, c(0.25, 0.75), type = 2)),
          format = jjcsformat_xx("xx.x, xx.x")
        )
      )
    }
  ) %>%
  analyze(
    "AVALCAT1",
    nested = FALSE,
    afun = a_freq_j,
    var_labels = "Total number of administrations, n (%)",
    extra_args = extra_args1,
    show_labels = "visible",
    indent_mod = 1L
  ) %>%
  analyze(
    "CRIT1",
    afun = a_freq_j,
    nested = FALSE,
    show_labels = "visible",
    var_labels = "Total number of administrations~[super a], n (%)",
    extra_args = extra_args1,
    indent_mod = 1L
  )


# Add in analzye for all remaining CRIT variables contained in ex
for (i in 2:countcritvars) {
  lyt <- lyt %>%
    analyze(
      paste0("CRIT", i, "FL"),
      afun = a_freq_j,
      extra_args = list(
        val = "Y",
        label = critlbls[[i]],
        denom = "n_df",
        .stats = c("count_unique_fraction")
      ),
      indent_mod = 2L,
      show_labels = "hidden"
    )
}


lyt <- lyt %>%
  analyze(
    "AVAL2",
    table_names = "AVAL2x",
    var_labels = "Cumulative dose ([units])",
    nested = FALSE,
    show_labels = "visible",
    indent_mod = 0L,
    afun = function(x) {
      list(
        "N" = rcell(length(x), format = jjcsformat_xx("xx"))
      )
    }
  ) %>%
  analyze(
    "AVAL2",
    nested = TRUE,
    var_labels = "Cumulative dose ([units])",
    show_labels = "hidden",
    indent_mod = 2L,
    afun = function(x) {
      list(
        "Mean (SD)" = rcell(
          c(mean(x), sd(x)),
          format = jjcsformat_xx("xx.x (xx.xx)")
        ),
        "Median" = rcell(median(x), format = jjcsformat_xx("xx.x")),
        "Min, max" = rcell(
          c(min(x), max(x)),
          format = jjcsformat_xx("xx., xx.")
        ),
        "Interquartile range" = rcell(
          c(quantile(x, c(0.25, 0.75), type = 2)),
          format = jjcsformat_xx("xx.x, xx.x")
        )
      )
    }
  ) %>%
  append_topleft("Parameter")

result <- build_table(lyt, ex, alt_counts_df = adsl)

# Add titles and footnotes:

result <- set_titles(result, tab_titles)

# Convert to tbl file and output table

tt_to_tlgrtf(string_map = string_map, tt = result, file = fileid, orientation = "portrait")

TSIEX03: Study Treatment Administration; Safety Analysis Set (Study jjcs - core)

Active Study Agent

Xanomeline High Dose

Xanomeline Low Dose

Combined

Placebo

Parameter

N=53

N=73

N=126

N=59

Total number of
 administrations

N

53

73

126

59

Mean (SD)

12.6 (9.24)

15.0 (8.78)

14.0 (9.02)

16.1 (9.01)

Median

11.0

16.0

15.0

17.0

Min, max

0, 29

0, 29

0, 29

0, 30

Interquartile range

4.0, 21.0

7.0, 23.0

5.0, 22.0

8.0, 24.0

Total number of
 administrations, n (%)

1 to <10

19 (38.0%)

21 (29.6%)

40 (33.1%)

15 (26.3%)

10 to <20

13 (26.0%)

22 (31.0%)

35 (28.9%)

15 (26.3%)

≥20

18 (36.0%)

28 (39.4%)

46 (38.0%)

27 (47.4%)

Total number of
 administrationsa,
 n (%)

≥1

53 (100.0%)

73 (100.0%)

126 (100.0%)

59 (100.0%)

≥2

47 (88.7%)

68 (93.2%)

115 (91.3%)

56 (94.9%)

≥3

45 (84.9%)

66 (90.4%)

111 (88.1%)

54 (91.5%)

≥5

36 (67.9%)

61 (83.6%)

97 (77.0%)

50 (84.7%)

≥10

31 (58.5%)

50 (68.5%)

81 (64.3%)

42 (71.2%)

Cumulative dose ([units])

N

53

73

126

59

Mean (SD)

2799.3 (1430.11)

2558.4 (1472.53)

2659.7 (1453.97)

2520.5 (1474.47)

Median

3301.0

2465.0

2884.5

2660.0

Min, max

298, 4927

102, 4978

102, 4978

187, 4963

Interquartile range

1561.0, 3984.0

1177.0, 3859.0

1326.0, 3914.0

1118.0, 4098.0

a Subjects are summarized in all applicable duration categories.

Download RTF file

TSIEX02
TSIEX04
Source Code
---
title: TSIEX03
subtitle: Study Treatment Administration
---

------------------------------------------------------------------------

{{< include ../../_utils/envir_hook.qmd >}}

```{r setup, echo = FALSE, warning = FALSE, message = FALSE}
options(docx.add_datetime = FALSE, tidytlg.add_datetime = FALSE)
envsetup_config_name <- "default"
# Path to the combined config file
envsetup_file_path <- file.path("../..", "envsetup.yml")

Sys.setenv(ENVSETUP_ENVIRON = '')
library(envsetup)
loaded_config <- config::get(config = envsetup_config_name, file = envsetup_file_path)
envsetup::rprofile(loaded_config)


dpscomp <- compound
dpspdr <- paste(protocol,dbrelease,rpteff,sep="__")

aptcomp <- compound
aptpdr <- paste(protocol,dbrelease,rpteff,sep="__")

###### Study specific updates (formerly in envre)

dpscomp <- "standards"
dpspdr <- "jjcs__NULL__jjcs - core"

apt <- FALSE
library(junco)
default_str_map <- rbind(default_str_map, c("&ctcae", "5.0"))

```

## Output

:::: panel-tabset
## {{< fa regular file-lines sm fw >}} Preview

```{r variant1, results='hide', warning = FALSE, message = FALSE}

# Program Name:              tsiex03.R

# Prep Environment

library(envsetup)
library(tern)
library(dplyr)
library(rtables)
library(junco)

# Define script level parameters:

# - Define output ID and file location

tblid <- "TSIEX03"
fileid <- tblid
tab_titles <- get_titles_from_file(input_path = '../../_data/', tblid)
string_map <- default_str_map


trtvar <- "TRT01A"
popfl <- "SAFFL"

catlevels <- c("1 to <10", "10 to <20", ">=20")

combined_colspan_trt <- TRUE

if (combined_colspan_trt == TRUE) {
  # Set up levels and label for the required combined columns
  add_combo <- add_combo_facet(
    "Combined",
    label = "Combined",
    levels = c("Xanomeline High Dose", "Xanomeline Low Dose")
  )

  # choose if any facets need to be removed - e.g remove the combined column for placebo
  rm_combo_from_placebo <- cond_rm_facets(
    facets = "Combined",
    ancestor_pos = NA,
    value = " ",
    split = "colspan_trt"
  )

  mysplit <- make_split_fun(post = list(add_combo, rm_combo_from_placebo))
}

# Process Data:

# Read in required data
adsl <- pharmaverseadamjnj::adsl %>%
  filter(!!rlang::sym(popfl) == "Y") %>%
  select(USUBJID, all_of(trtvar), all_of(popfl))

# If AVISIT is not present in ADEXSUM than create 'Overall' as the Visit, which is used
# for the filtering AVISIT records if it does exist
adexsum1 <- pharmaverseadamjnj::adexsum %>%
  mutate(VISIT = if (exists("AVISIT")) AVISIT else "Overall") %>%
  filter(PARAMCD == "TNUMDOS" & !is.na(AVAL) & VISIT == "Overall") %>%
  mutate(AVAL1 = AVAL) %>%
  select(STUDYID, USUBJID, PARAMCD, AVAL1, AVALCAT1, starts_with("CRIT"))

adexsum2 <- pharmaverseadamjnj::adexsum %>%
  mutate(VISIT = if (exists("AVISIT")) AVISIT else "Overall") %>%
  filter(PARAMCD == "CUMDOSE" & !is.na(AVAL) & VISIT == "Overall") %>%
  mutate(AVAL2 = AVAL) %>%
  select(STUDYID, USUBJID, PARAMCD, AVAL2)

adexsum <- bind_rows(adexsum1, adexsum2) %>%
  select(STUDYID, USUBJID, PARAMCD, AVAL1, AVAL2, AVALCAT1, starts_with("CRIT"))

adsl$colspan_trt <- factor(
  ifelse(adsl[[trtvar]] == "Placebo", " ", "Active Study Agent"),
  levels = c("Active Study Agent", " ")
)

# join data together
ex <- adexsum %>% inner_join(., adsl, by = c("USUBJID"))

# Keep only columns with some data in which will remove any unwanted CRITy variables
ex <- ex[, colSums(is.na(ex)) < nrow(ex)]

# Work out how many CRITy vars we have left
excritvars <- ex %>%
  select(num_range("CRIT", 1:99))

countcritvars <- length(names(excritvars))

# Drop unwanted levels for all CRITy variables you have remaining in ex and also for AVALCAT1

critlbls <- list()
for (i in 1:countcritvars) {
  variable_name <- paste0("CRIT", i)
  ex[[variable_name]] <- droplevels(ex[[variable_name]])
  critlbls[[i]] <- unique(as.character(ex[[variable_name]][
    !is.na(ex[[variable_name]])
  ]))
}

# drop unwanted levels from AVALCAT1 and assign levels from specified section at the top of script
ex$AVALCAT1 <- droplevels(ex$AVALCAT1)
ex$AVALCAT1 <- factor(ex$AVALCAT1, levels = catlevels)

colspan_trt_map <- create_colspan_map(
  adsl,
  non_active_grp = "Placebo",
  non_active_grp_span_lbl = " ",
  active_grp_span_lbl = "Active Study Agent",
  colspan_var = "colspan_trt",
  trt_var = trtvar
)

# Define layout and build table:

extra_args1 <- list(
  .stats = "count_unique_fraction",
  denom = "n_df"
)

extra_args2 <- list(
  denom = "n_df",
  .stats = "count_unique_fraction"
)

lyt <- rtables::basic_table(
  top_level_section_div = " ",
  show_colcounts = TRUE,
  colcount_format = "N=xx"
) %>%
  split_cols_by(
    "colspan_trt",
    split_fun = trim_levels_to_map(map = colspan_trt_map)
  )

if (combined_colspan_trt == TRUE) {
  lyt <- lyt %>%
    split_cols_by(trtvar, split_fun = mysplit)
} else {
  lyt <- lyt %>%
    split_cols_by(trtvar)
}

lyt <- lyt %>%
  analyze(
    "AVAL1",
    table_names = "AVAL1x",
    var_labels = "Total number of administrations",
    show_labels = "visible",
    indent_mod = 0L,
    afun = function(x) {
      list(
        "N" = rcell(length(x), format = jjcsformat_xx("xx"))
      )
    }
  ) %>%
  analyze(
    "AVAL1",
    nested = TRUE,
    var_labels = "Total number of administrations",
    show_labels = "hidden",
    indent_mod = 2L,
    afun = function(x) {
      list(
        "Mean (SD)" = rcell(
          c(mean(x), sd(x)),
          format = jjcsformat_xx("xx.x (xx.xx)")
        ),
        "Median" = rcell(median(x), format = jjcsformat_xx("xx.x")),
        "Min, max" = rcell(
          c(min(x), max(x)),
          format = jjcsformat_xx("xx., xx.")
        ),
        "Interquartile range" = rcell(
          c(quantile(x, c(0.25, 0.75), type = 2)),
          format = jjcsformat_xx("xx.x, xx.x")
        )
      )
    }
  ) %>%
  analyze(
    "AVALCAT1",
    nested = FALSE,
    afun = a_freq_j,
    var_labels = "Total number of administrations, n (%)",
    extra_args = extra_args1,
    show_labels = "visible",
    indent_mod = 1L
  ) %>%
  analyze(
    "CRIT1",
    afun = a_freq_j,
    nested = FALSE,
    show_labels = "visible",
    var_labels = "Total number of administrations~[super a], n (%)",
    extra_args = extra_args1,
    indent_mod = 1L
  )


# Add in analzye for all remaining CRIT variables contained in ex
for (i in 2:countcritvars) {
  lyt <- lyt %>%
    analyze(
      paste0("CRIT", i, "FL"),
      afun = a_freq_j,
      extra_args = list(
        val = "Y",
        label = critlbls[[i]],
        denom = "n_df",
        .stats = c("count_unique_fraction")
      ),
      indent_mod = 2L,
      show_labels = "hidden"
    )
}


lyt <- lyt %>%
  analyze(
    "AVAL2",
    table_names = "AVAL2x",
    var_labels = "Cumulative dose ([units])",
    nested = FALSE,
    show_labels = "visible",
    indent_mod = 0L,
    afun = function(x) {
      list(
        "N" = rcell(length(x), format = jjcsformat_xx("xx"))
      )
    }
  ) %>%
  analyze(
    "AVAL2",
    nested = TRUE,
    var_labels = "Cumulative dose ([units])",
    show_labels = "hidden",
    indent_mod = 2L,
    afun = function(x) {
      list(
        "Mean (SD)" = rcell(
          c(mean(x), sd(x)),
          format = jjcsformat_xx("xx.x (xx.xx)")
        ),
        "Median" = rcell(median(x), format = jjcsformat_xx("xx.x")),
        "Min, max" = rcell(
          c(min(x), max(x)),
          format = jjcsformat_xx("xx., xx.")
        ),
        "Interquartile range" = rcell(
          c(quantile(x, c(0.25, 0.75), type = 2)),
          format = jjcsformat_xx("xx.x, xx.x")
        )
      )
    }
  ) %>%
  append_topleft("Parameter")

result <- build_table(lyt, ex, alt_counts_df = adsl)

# Add titles and footnotes:

result <- set_titles(result, tab_titles)

# Convert to tbl file and output table

tt_to_tlgrtf(string_map = string_map, tt = result, file = fileid, orientation = "portrait")
```
```{r result1, echo=FALSE, message=FALSE, warning=FALSE, test = list(result_v1 = "result")}
tt_to_flextable_j(result, tblid, string_map = string_map) 
```

[Download RTF file](`r paste0(tolower(tblid), '.rtf')`)
::::

Made with ❤️ by the J&J Team

  • Edit this page
  • Report an issue
Cookie Preferences