# Program Name: tsfae10.R# Prep Environmentlibrary(envsetup)library(tern)library(dplyr)library(rtables)library(junco)# Define script level parameters:# - Define output ID and file locationtblid <-"TSFAE10"fileid <- tblidtab_titles <-get_titles_from_file(input_path ='../../_data/', tblid)string_map <- default_str_maptrtvar <-"TRT01A"popfl <-"SAFFL"aerelvar <-"AEREL"combined_colspan_trt <-TRUErisk_diff <-TRUErr_method <-"wald"ctrl_grp <-"Placebo"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:adsl <- pharmaverseadamjnj::adsl %>%filter(!!rlang::sym(popfl) =="Y") %>%select(STUDYID, USUBJID, all_of(trtvar), all_of(popfl))# define criteria for related AEadae <- pharmaverseadamjnj::adae %>%filter(TRTEMFL =="Y"&!!rlang::sym(aerelvar) =="RELATED") %>%select(USUBJID, TRTEMFL, AEDECOD)adsl$colspan_trt <-factor(ifelse(adsl[[trtvar]] =="Placebo", " ", "Active Study Agent"),levels =c("Active Study Agent", " "))if (risk_diff ==TRUE) { adsl$rrisk_header <-"Risk Difference (%) (95% CI)" adsl$rrisk_label <-paste(adsl[[trtvar]], paste("vs", ctrl_grp))}# join data togetherae <- adae %>%right_join(., adsl, by =c("USUBJID"))colspan_trt_map <-create_colspan_map( adsl,non_active_grp = ctrl_grp,non_active_grp_span_lbl =" ",active_grp_span_lbl ="Active Study Agent",colspan_var ="colspan_trt",trt_var = trtvar)# Define layout and build table:ref_path <-c("colspan_trt", " ", "TRT01A", "Placebo")extra_args_rr <-list(method = rr_method,ref_path = ref_path,.stats =c("count_unique_fraction"))lyt <-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)}if (risk_diff ==TRUE) { lyt <- lyt %>%split_cols_by("rrisk_header", nested =FALSE) %>%split_cols_by( trtvar,labels_var ="rrisk_label",split_fun =remove_split_levels("Placebo") )}lyt <- lyt %>%analyze("AEDECOD",afun = a_freq_j,extra_args =append(extra_args_rr, NULL),show_labels ="hidden" ) %>%append_topleft("Preferred Term, n (%)")result <-build_table(lyt, ae, alt_counts_df = adsl)if (length(adae$TRTEMFL) !=0) {########################################################################################## Post-Processing step to sort by descending count on chosen active treatment columns.# Default is the last treatment (inc. Combined if applicable) under the active treatment# spanning header (defaulted to colspan_trt variable). See function documentation for# jj_complex_scorefun should your require a different sorting behavior.######################################################################################### result <-sort_at_path(result, c("AEDECOD"), scorefun =jj_complex_scorefun())################################################################################# Prune table to only keep those that meet x% criteria on any treatment column################################################################################ more_than_x_percent <-has_fraction_in_any_col(atleast =0.05,col_names =c("Active Study Agent.Xanomeline High Dose","Active Study Agent.Xanomeline Low Dose"," .Placebo" ) ) result <-safe_prune_table(result, keep_rows(more_than_x_percent))}## Remove any rogue null rowsresult <- result %>%safe_prune_table(prune_func =keep_rows(keep_non_null_rows))## Remove the N=xx column headers for the risk difference columnsresult <-remove_col_count(result)# Add titles and footnotes:result <-set_titles(result, tab_titles)# Convert to tbl file and output tablett_to_tlgrtf(string_map = string_map, tt = result, file = fileid, orientation ="landscape")
TSFAE10:Subjects With Treatment-emergent Related Adverse Events With Frequency =[X]% in [Any Treatment Group] by Preferred Term; Safety Analysis Set (Study jjcs - core)
Active Study Agent
Risk Difference (%) (95% CI)
Xanomeline High Dose
Xanomeline Low Dose
Combined
Placebo
Xanomeline High Dose vs Placebo
Xanomeline Low Dose vs Placebo
Preferred Term, n (%)
N=53
N=73
N=126
N=59
DIZZINESS
4 (7.5%)
2 (2.7%)
6 (4.8%)
0
7.5 (0.4, 14.7)
2.7 (-1.0, 6.5)
UPPER RESPIRATORY TRACT INFECTION
0
0
0
3 (5.1%)
-5.1 (-10.7, 0.5)
-5.1 (-10.7, 0.5)
Note: Subjects are counted only once for any given event, regardless of the number of times they actually experienced the event.
Note: Adverse events are coded using MedDRA version 26.0.