FDA Table 36
Subjects With Maximum Postbaseline Systolic Blood Pressure by Category of Blood Pressure, Safety Population, Pooled Analysis (or Trial X)
table
FDA
safety
vital signs
Code
# Load libraries & data -------------------------------------
library(dplyr)
library(cards)
library(gtsummary)
adsl <- random.cdisc.data::cadsl
advs <- random.cdisc.data::cadvs
# Pre-processing --------------------------------------------
adsl <- adsl |>
filter(SAFFL == "Y") # safety population
data <- advs |>
filter(
# safety population
SAFFL == "Y",
# systolic blood pressure
PARAMCD == "SYSBP",
# post-baseline visits
AVISITN >= 1
) |>
# analyze maximum values of each subject
slice_max(AVAL, n = 1L, by = USUBJID) |>
# define analysis value cutoffs
mutate(
L90 = AVAL < 90, # SYSBP <90
GE90 = AVAL >= 90, # SYSBP >=90
GE120 = AVAL >= 120, # SYSBP >=120
GE140 = AVAL >= 140, # SYSBP >=140
GE160 = AVAL >= 160, # SYSBP >=160
GE180 = AVAL >= 180 # SYSBP >=180
)
Code
ard <- bind_ard(
ard_dichotomous(
data,
variables = c(L90, GE90, GE120, GE140, GE160, GE180),
by = TRT01A,
statistic = ~ c("n", "p"),
# denominator values are number of subjects in arm with BP data
denominator = data |> distinct(USUBJID, TRT01A)
),
# ARD for header N values
ard_categorical(adsl, variables = TRT01A)
)
ard
{cards} data frame: 45 x 11
group1 group1_level variable variable_level context stat_name stat_label stat fmt_fun warning error
1 TRT01A A: Drug X L90 TRUE dichotom… n n 0 0
2 TRT01A A: Drug X L90 TRUE dichotom… p % 0 <fn>
3 TRT01A A: Drug X GE90 TRUE dichotom… n n 134 0
4 TRT01A A: Drug X GE90 TRUE dichotom… p % 1 <fn>
5 TRT01A A: Drug X GE120 TRUE dichotom… n n 134 0
6 TRT01A A: Drug X GE120 TRUE dichotom… p % 1 <fn>
7 TRT01A A: Drug X GE140 TRUE dichotom… n n 133 0
8 TRT01A A: Drug X GE140 TRUE dichotom… p % 0.993 <fn>
9 TRT01A A: Drug X GE160 TRUE dichotom… n n 126 0
10 TRT01A A: Drug X GE160 TRUE dichotom… p % 0.94 <fn>
11 TRT01A A: Drug X GE180 TRUE dichotom… n n 78 0
12 TRT01A A: Drug X GE180 TRUE dichotom… p % 0.582 <fn>
13 TRT01A B: Place… L90 TRUE dichotom… n n 0 0
14 TRT01A B: Place… L90 TRUE dichotom… p % 0 <fn>
15 TRT01A B: Place… GE90 TRUE dichotom… n n 134 0
16 TRT01A B: Place… GE90 TRUE dichotom… p % 1 <fn>
17 TRT01A B: Place… GE120 TRUE dichotom… n n 133 0
18 TRT01A B: Place… GE120 TRUE dichotom… p % 0.993 <fn>
19 TRT01A B: Place… GE140 TRUE dichotom… n n 132 0
20 TRT01A B: Place… GE140 TRUE dichotom… p % 0.985 <fn>
21 TRT01A B: Place… GE160 TRUE dichotom… n n 120 0
22 TRT01A B: Place… GE160 TRUE dichotom… p % 0.896 <fn>
23 TRT01A B: Place… GE180 TRUE dichotom… n n 74 0
24 TRT01A B: Place… GE180 TRUE dichotom… p % 0.552 <fn>
25 TRT01A C: Combi… L90 TRUE dichotom… n n 0 0
26 TRT01A C: Combi… L90 TRUE dichotom… p % 0 <fn>
27 TRT01A C: Combi… GE90 TRUE dichotom… n n 132 0
28 TRT01A C: Combi… GE90 TRUE dichotom… p % 1 <fn>
29 TRT01A C: Combi… GE120 TRUE dichotom… n n 132 0
30 TRT01A C: Combi… GE120 TRUE dichotom… p % 1 <fn>
31 TRT01A C: Combi… GE140 TRUE dichotom… n n 132 0
32 TRT01A C: Combi… GE140 TRUE dichotom… p % 1 <fn>
33 TRT01A C: Combi… GE160 TRUE dichotom… n n 121 0
34 TRT01A C: Combi… GE160 TRUE dichotom… p % 0.917 <fn>
35 TRT01A C: Combi… GE180 TRUE dichotom… n n 73 0
36 TRT01A C: Combi… GE180 TRUE dichotom… p % 0.553 <fn>
37 <NA> TRT01A A: Drug X categori… n n 134 0
38 <NA> TRT01A A: Drug X categori… N N 400 0
39 <NA> TRT01A A: Drug X categori… p % 0.335 <fn>
40 <NA> TRT01A B: Place… categori… n n 134 0
ℹ 5 more rows
ℹ Use `print(n = ...)` to see more rows
Code
tbl <- tbl_ard_summary(
ard,
by = TRT01A,
# Add labels for each range
label = list(
L90 = "<90",
GE90 = ">=90",
GE120 = ">=120",
GE140 = ">=140",
GE160 = ">=160",
GE180 = ">=180"
)
) |>
modify_header(
# Update label, add analysis value units
label ~ paste0("**Systolic Blood Pressure (", data$AVALU[1], ")**"),
# Add N values to `by` variable labels
all_stat_cols() ~ "**{level}** \nN = {n}"
)
tbl