|
| 1 | +#' FDA Table 38: Patients With Adverse Events by System Organ Class, FDA Medical Query (Broad) and Preferred Term, |
| 2 | +#' Safety Population, Pooled Analysis (or Trial X) |
| 3 | +#' |
| 4 | +#' @details |
| 5 | +#' * `adae` must contain the variables `AEBODSYS`, `AESER`, and the variables specified by |
| 6 | +#' `arm_var`, `id_var`, `saffl_var`, `trtemfl_var`, `fmqsc_var`, `fmqnam_var`, and `pref_var`. |
| 7 | +#' * If specified, `alt_counts_df` must contain the variables specified by `arm_var`, `id_var`, and `saffl_var`. |
| 8 | +#' * Flag variables (i.e. `XXXFL`) are expected to have two levels: `"Y"` (true) and `"N"` (false). Missing values in |
| 9 | +#' flag variables are treated as `"N"`. |
| 10 | +#' * Columns are split by arm. Overall population column is excluded by default (see `lbl_overall` argument). |
| 11 | +#' * Numbers in table represent the absolute numbers of patients and fraction of `N`. |
| 12 | +#' * All-zero rows are removed by default (see `prune_0` argument). |
| 13 | +#' |
| 14 | +#' @inheritParams argument_convention |
| 15 | +#' |
| 16 | +#' @examples |
| 17 | +#' library(dplyr) |
| 18 | +#' |
| 19 | +#' adae <- random.cdisc.data::cadae |
| 20 | +#' adsl <- random.cdisc.data::cadsl |
| 21 | +#' |
| 22 | +#' set.seed(1) |
| 23 | +#' adae <- adae %>% |
| 24 | +#' rename(FMQ01SC = SMQ01SC) %>% |
| 25 | +#' mutate( |
| 26 | +#' AESER = sample(c("Y", "N"), size = nrow(adae), replace = TRUE), |
| 27 | +#' FMQ01NAM = sample(c("FMQ1", "FMQ2", "FMQ3"), size = nrow(adae), replace = TRUE) |
| 28 | +#' ) |
| 29 | +#' adae$FMQ01SC[is.na(adae$FMQ01SC)] <- "Broad" |
| 30 | +#' |
| 31 | +#' tbl <- make_table_38(adae = adae, alt_counts_df = adsl) |
| 32 | +#' tbl |
| 33 | +#' |
| 34 | +#' @export |
| 35 | +make_table_38 <- function(adae, |
| 36 | + alt_counts_df = NULL, |
| 37 | + show_colcounts = TRUE, |
| 38 | + id_var = "USUBJID", |
| 39 | + arm_var = "ARM", |
| 40 | + saffl_var = "SAFFL", |
| 41 | + trtemfl_var = "TRTEMFL", |
| 42 | + fmqsc_var = "FMQ01SC", |
| 43 | + fmqnam_var = "FMQ01NAM", |
| 44 | + fmq_scope = "BROAD", |
| 45 | + pref_var = "AEDECOD", |
| 46 | + lbl_overall = NULL, |
| 47 | + lbl_pref_var = formatters::var_labels(adae, fill = TRUE)[pref_var], |
| 48 | + risk_diff = NULL, |
| 49 | + prune_0 = TRUE, |
| 50 | + na_level = "<Missing>", |
| 51 | + annotations = NULL) { |
| 52 | + checkmate::assert_subset(c( |
| 53 | + "AEBODSYS", arm_var, id_var, saffl_var, trtemfl_var, fmqsc_var, |
| 54 | + fmqnam_var, pref_var |
| 55 | + ), names(adae)) |
| 56 | + assert_flag_variables(adae, saffl_var, trtemfl_var) |
| 57 | + checkmate::assert_subset(toupper(fmq_scope), c("NARROW", "BROAD")) |
| 58 | + |
| 59 | + adae <- adae %>% |
| 60 | + filter(.data[[saffl_var]] == "Y", .data[[trtemfl_var]] == "Y", .data[[fmqsc_var]] == fmq_scope) %>% |
| 61 | + df_explicit_na(na_level = na_level) |
| 62 | + adae[[fmqnam_var]] <- with_label(adae[[fmqnam_var]], paste0("FMQ (", tools::toTitleCase(tolower(fmq_scope)), ")")) |
| 63 | + |
| 64 | + alt_counts_df <- alt_counts_df_preproc(alt_counts_df, id_var, arm_var, saffl_var) |
| 65 | + |
| 66 | + lyt <- basic_table_annot(show_colcounts, annotations) %>% |
| 67 | + split_cols_by_arm(arm_var, lbl_overall, risk_diff) %>% |
| 68 | + split_rows_by( |
| 69 | + var = "AEBODSYS", |
| 70 | + split_fun = drop_split_levels, |
| 71 | + split_label = obj_label(adae$AEBODSYS), |
| 72 | + label_pos = "topleft" |
| 73 | + ) %>% |
| 74 | + split_rows_by( |
| 75 | + fmqnam_var, |
| 76 | + child_labels = "hidden", |
| 77 | + label_pos = "topleft", |
| 78 | + split_label = obj_label(adae[[fmqnam_var]]) |
| 79 | + ) %>% |
| 80 | + summarize_num_patients( |
| 81 | + var = id_var, |
| 82 | + .stats = "unique", |
| 83 | + .labels = c(unique = NULL), |
| 84 | + riskdiff = !is.null(risk_diff) |
| 85 | + ) %>% |
| 86 | + count_occurrences( |
| 87 | + vars = pref_var, |
| 88 | + riskdiff = !is.null(risk_diff) |
| 89 | + ) %>% |
| 90 | + append_topleft(paste(" ", lbl_pref_var)) |
| 91 | + |
| 92 | + tbl <- build_table(lyt, df = adae, alt_counts_df = alt_counts_df) |
| 93 | + if (prune_0) tbl <- prune_table(tbl) |
| 94 | + |
| 95 | + tbl |
| 96 | +} |
0 commit comments