# Program Name: tsfvit02# Prep environment:library(envsetup)library(tern)library(dplyr)library(rtables)library(junco)# Define script level parameters:tblid <-"TSFVIT02"fileid <- tblidtitles <-get_titles_from_file(input_path ='../../_data/', tblid)string_map <- default_str_mappopfl <-"SAFFL"trtvar <-"TRT01A"ctrl_grp <-"Placebo"selparamcd <-c("SYSBP", "DIABP")### tsfvit02aselparamcd <-c("SYSBP")### tsfvit02b : no code updates needed# selparamcd <- c("DIABP")### as in dataset, order is important for later processing### not automated, hard coded approach for ease of reading### ideally the datasets already contain the appropriate case, to ensure units are in proper casesel_param <-c("Systolic Blood Pressure (mmHg)")sel_param_case <-c("Systolic blood pressure (mmHg)")# Process Data:adsl <- pharmaverseadamjnj::adsl %>%filter(.data[[popfl]] =="Y") %>%select( USUBJID,all_of(c(popfl, trtvar)), SEX_DECODE, AGEGR1, RACE_DECODE, ETHNIC_DECODE )adsl$colspan_trt <-factor(ifelse(adsl[[trtvar]] == ctrl_grp, " ", "Active Study Agent"),levels =c("Active Study Agent", " "))adsl$rrisk_header <-"Risk Difference (%) (95% CI)"adsl$rrisk_label <-paste(adsl[[trtvar]], paste("vs", ctrl_grp))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)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)ref_path <-c("colspan_trt", " ", trtvar, ctrl_grp)### note: by filter ANL06FL, this table is restricted to On-treatment values, per definition of ANL06FL### therefor, no need to add ONTRTFL in filter### if derivation of ANL06FL is not restricted to ONTRTFL records, adding ONTRTFL here will not give the correct answer either### as mixing worst with other period is not giving the proper selection !!!filtered_advs <- pharmaverseadamjnj::advs %>%filter(PARAMCD %in% selparamcd) %>%filter(ANL06FL =="Y") %>%select( STUDYID, USUBJID, PARAMCD, PARAM, AVALCAT1, AVALCA1N, AVISIT, ANL06FL, APOBLFL, ONTRTFL ) %>%inner_join(adsl)filtered_advs$PARAM <-factor(as.character(filtered_advs$PARAM),levels = sel_param,labels = sel_param_case)# Process markedly abnormal values from spreadsheet:### Markedly Abnormal spreadsheetmarkedlyabnormal_file <-file.path('../../_data', "markedlyabnormal.xlsx")markedlyabnormal_sheets <- readxl::excel_sheets(markedlyabnormal_file)lbmarkedlyabnormal_defs <- readxl::read_excel( markedlyabnormal_file,sheet ="ADVS") %>%filter(PARAMCD !="Parameter Code") %>%arrange(PARAMCD, VARNAME, ORDER) %>%filter(VARNAME =="AVALCAT1") %>%filter(PARAMCD %in% selparamcd) %>%left_join(., unique(filtered_advs %>%select(PARAMCD, PARAM)))# code_decode <- getcodelistinfo(df=filtered_advs,# domain="advs",# vars = c("AVALCAT1"),# APT= apt,# adam_meta_loc=am_in,# sdtm_meta_loc=dm_in)### code_decode <- code_decode %>%# filter(PARAMCD %in% selparamcd) %>%# left_join(.,unique(filtered_advs %>% select(PARAMCD,PARAM)))### create a mapping table for usage in split_fun trim_levels_to_map,### to ensure only the levels appropriate for the selected parameters are coveredparam_map <- lbmarkedlyabnormal_defs %>%rename(AVALCAT1 = CRIT) %>%### no factors are allowed in this split_fun map definitionmutate(PARAM =as.character(PARAM)) %>%select(PARAM, AVALCAT1)# if no code list was defined, not all defined categories might be present on data# sas2rds conversion might not have added all categories as factor levels - need to do this hereif (class(filtered_advs$AVALCAT1) =="character"||!all(unique(param_map$AVALCAT1) %in%levels(filtered_advs$AVALCAT1))) { filtered_advs$AVALCAT1 <-factor(as.character(filtered_advs$AVALCAT1),levels =unique(param_map$AVALCAT1) )}# filtered_advs$PARAM <- droplevels(filtered_advs$PARAM)filtered_advs <-var_relabel(filtered_advs, PARAM ="Blood Pressure")# Define layout and build table:extra_args_rr <-list(method ="wald",denom ="n_df",ref_path = ref_path,.stats =c("denom", "count_unique_fraction"))lyt0 <-basic_table(show_colcounts =TRUE,colcount_format ="N=xx") %>%split_cols_by("colspan_trt",split_fun =trim_levels_to_map(map = colspan_trt_map) ) %>%split_cols_by(trtvar) %>%split_cols_by("rrisk_header", nested =FALSE) %>%split_cols_by( trtvar,labels_var ="rrisk_label",split_fun =remove_split_levels(ctrl_grp) ) %>%split_rows_by("PARAM",label_pos ="topleft",child_labels ="hidden",split_label ="Systolic Blood Pressure (mmHg), n (%)",section_div =" ",## ensure only the appropriate levels inside PARAM-AVALCAT1 will be includedsplit_fun =trim_levels_to_map(param_map) )# version without explicit denominator (as in shell)lyt <- lyt0 %>%# for testing, it is sometimes convenient to explicitely show the used denominatoranalyze("AVALCAT1", a_freq_j,extra_args = extra_args_rr,show_labels ="hidden",indent_mod =0L )result <-build_table(lyt, filtered_advs, alt_counts_df = adsl)# Post-Processing:result <-remove_col_count(result)# Add titles and footnotes:result <-set_titles(result, titles)# Convert to tbl file and output tablett_to_tlgrtf(string_map = string_map, tt = result, file = fileid, orientation ="landscape")
TSFVIT02:Subjects With Maximum On-treatment Systolic Blood Pressure by Category of Blood Pressure; Safety Analysis Set (Study jjcs - core)
Active Study Agent
Risk Difference (%) (95% CI)
Xanomeline High Dose
Xanomeline Low Dose
Placebo
Xanomeline High Dose vs Placebo
Xanomeline Low Dose vs Placebo
Systolic Blood Pressure (mmHg), n (%)
N=53
N=73
N=59
N
49
69
55
<90
0
0
4 (7.3%)
-7.3 (-14.1, -0.4)
-7.3 (-14.1, -0.4)
≥90 to 119
27 (55.1%)
23 (33.3%)
27 (49.1%)
6.0 (-13.2, 25.2)
-15.8 (-33.0, 1.5)
≥120 to 139
17 (34.7%)
30 (43.5%)
18 (32.7%)
2.0 (-16.2, 20.2)
10.8 (-6.3, 27.8)
≥140 to 159
5 (10.2%)
12 (17.4%)
6 (10.9%)
-0.7 (-12.5, 11.1)
6.5 (-5.7, 18.6)
≥160 to 179
0
4 (5.8%)
0
0.0 (0.0, 0.0)
5.8 (0.3, 11.3)
≥180
0
0
0
0.0 (0.0, 0.0)
0.0 (0.0, 0.0)
Note: On-treatment is defined as blood pressure values obtained after the first dose and within [30 days] following treatment discontinuation.