FDA Table 31
Percentage of Patients With Maximum Systolic Blood Pressure by Category of Blood Pressure Postbaseline, Safety Population, Pooled Analysis
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 & AVAL < 120, # SYSBP >=90
GE120 = AVAL >= 120 & AVAL < 140, # SYSBP >=120
GE140 = AVAL >= 140 & AVAL < 160, # SYSBP >=140
GE160 = AVAL >= 160 & AVAL < 180, # SYSBP >=160
GE180 = AVAL >= 180 # SYSBP >=180
)
{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 0 0
4 TRT01A A: Drug X GE90 TRUE dichotom… p % 0 <fn>
5 TRT01A A: Drug X GE120 TRUE dichotom… n n 1 0
6 TRT01A A: Drug X GE120 TRUE dichotom… p % 0.007 <fn>
7 TRT01A A: Drug X GE140 TRUE dichotom… n n 7 0
8 TRT01A A: Drug X GE140 TRUE dichotom… p % 0.052 <fn>
9 TRT01A A: Drug X GE160 TRUE dichotom… n n 48 0
10 TRT01A A: Drug X GE160 TRUE dichotom… p % 0.358 <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 1 0
16 TRT01A B: Place… GE90 TRUE dichotom… p % 0.007 <fn>
17 TRT01A B: Place… GE120 TRUE dichotom… n n 1 0
18 TRT01A B: Place… GE120 TRUE dichotom… p % 0.007 <fn>
19 TRT01A B: Place… GE140 TRUE dichotom… n n 12 0
20 TRT01A B: Place… GE140 TRUE dichotom… p % 0.09 <fn>
21 TRT01A B: Place… GE160 TRUE dichotom… n n 46 0
22 TRT01A B: Place… GE160 TRUE dichotom… p % 0.343 <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 0 0
28 TRT01A C: Combi… GE90 TRUE dichotom… p % 0 <fn>
29 TRT01A C: Combi… GE120 TRUE dichotom… n n 0 0
30 TRT01A C: Combi… GE120 TRUE dichotom… p % 0 <fn>
31 TRT01A C: Combi… GE140 TRUE dichotom… n n 11 0
32 TRT01A C: Combi… GE140 TRUE dichotom… p % 0.083 <fn>
33 TRT01A C: Combi… GE160 TRUE dichotom… n n 48 0
34 TRT01A C: Combi… GE160 TRUE dichotom… p % 0.364 <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 \n(", data$AVALU[1], ")**"),
# Add N values to `by` variable labels
all_stat_cols() ~ "**{level}** \nN = {n}"
)
tbl