This will call freq()
multiple times and combine the levels together. This
is useful for adverse event and concomitant mediations.
nested_freq(
df,
denom_df = df,
colvar = NULL,
tablebyvar = NULL,
rowvar = NULL,
rowbyvar = NULL,
statlist = getOption("tidytlg.nested_freq.statlist.default"),
decimal = 1,
cutoff = NULL,
cutoff_stat = "pct",
subset = TRUE,
descending_by = NULL,
display_missing = FALSE,
rowtext = NULL,
row_header = NULL,
.keep = TRUE,
.ord = FALSE,
...
)
(required) dataframe containing the two levels to summarize
(optional) dataframe containing records to use as the denominator (default = df)
(required) treatment variable within df to use to summarize
(optional) repeat entire table by variable within df.
(required) nested levels separated by a star, for example AEBODSYS*AEDECOD, this can handle up to three levels.
(optional) repeat rowvar
by variable within df
(optional) count/percent type to return (default = "n (x.x)")
(optional) decimal precision root level (default = 1)
(optional) numeric value used to cut the data to a percentage threshold, if any column meets the threshold the entire record is kept.
(optional) The value to cutoff by, n or pct. (default = 'pct')
(optional) An R expression that will be passed to a
dplyr::filter()
function to subset the data.frame
(optional) The column or columns to sort descending values by. Can also provide a named list to do ascending order. ex. c("VarName1" = "asc", "VarName2" = "desc") would sort by VarName1 in ascending order and VarName2 in descending order. If not provided, the columns will be sorted alphabetically.
(optional) Should the "missing" values be displayed? (default = FALSE)
(optional) A character vector used to rename the label
column. If named, names will give the new level and values will be the
replaced value. If unnamed, and the table has only one row, the rowtext
will rename the label
of the row.
(optional) A character vector to be added to the table.
(optional) Should the rowbyvar
and tablebyvar
be output in the
table. If FALSE, rowbyvar
will still be output in the label
column.
(default = TRUE)
Should the ordering columns be output with the table? This is useful if a table needs to be merged or reordered in any way after build.
(optional) Named arguments to be included as columns on the table.
A dataframe of nested results by colvar
and optional tablebyvar
.
There are a few additional variable sets added to support multiple
requirements.
The level variables (level1_
, level2_
,
level3_
) will carry down the counts for each level to every record. This
allows for easy sorting of nested groups.
The header variables
(header1
, header2
, header3
) will flag the header for each level to
ensure each level header is sorted to the top of the level.
The n
variables ("n_") provide a numeric variable containing frequency for each
colvar
. This can be used to sort and filter records.
The pct
variables ("pct_") provide a numeric variable containing percentages for
each colvar
. This can be used to sort and filter records.
adae <- data.frame(
SITEID = c("100", "100", "100","200", "200", "200"),
USUBJID = c("Demo1-101", "Demo1-102", "Demo1-103",
"Demo1-104", "Demo1-105", "Demo1-106"),
AEBODSYS = c("Cardiac disorders", "Cardiac disorders",
"Respiratory, thoracic and mediastinal disorders",
"Infections and infestations",
"Skin and subcutaneous tissue disorders",
"Infections and infestations"),
AEDECOD = c("Arrhythmia supraventricular", "Cardiac failure",
"Chronic obstructive pulmonary disease", "Pneumonia",
"Pustular psoriasis", "Upper respiratory tract infection"),
colnbr = structure(
c(1L, 2L, 3L, 1L, 2L, 3L),
.Label = c("Active", "Placebo", "Comparator"),
class = "factor"
)
)
# Frequency and percent for two levels of nesting
nested_freq(adae
,colvar = "colnbr"
,rowvar = "AEBODSYS*AEDECOD"
,statlist = statlist("n (x.x%)"))
#> Column Variables: colnbr
#> Row Variable: AEBODSYS*AEDECOD
#> Statistic Formatting: n (x.x%)
#> Value Cutoffs: pct by variable pct
#> Descending By: Factored Sorting
#> Denominators By Variables: colnbr
#> # A tibble: 10 × 8
#> label Active Placebo Comparator row_type nested_level group_level AEBODSYS
#> * <chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <fct>
#> 1 Cardiac… 1 (50… 1 (50.… 0 NESTED 0 0 Cardiac…
#> 2 Arrhyth… 1 (50… 0 0 NESTED 1 0 Cardiac…
#> 3 Cardiac… 0 1 (50.… 0 NESTED 1 0 Cardiac…
#> 4 Infecti… 1 (50… 0 1 (50.0%) NESTED 0 0 Infecti…
#> 5 Pneumon… 1 (50… 0 0 NESTED 1 0 Infecti…
#> 6 Upper r… 0 0 1 (50.0%) NESTED 1 0 Infecti…
#> 7 Respira… 0 0 1 (50.0%) NESTED 0 0 Respira…
#> 8 Chronic… 0 0 1 (50.0%) NESTED 1 0 Respira…
#> 9 Skin an… 0 1 (50.… 0 NESTED 0 0 Skin an…
#> 10 Pustula… 0 1 (50.… 0 NESTED 1 0 Skin an…
# Frequency and percent for three levels of nesting (for illustrative
# purpose)
nested_freq(adae
,colvar = "colnbr"
,rowvar = "SITEID*AEBODSYS*AEDECOD"
,statlist = statlist("n (x.x%)"))
#> Column Variables: colnbr
#> Row Variable: SITEID*AEBODSYS*AEDECOD
#> Statistic Formatting: n (x.x%)
#> Value Cutoffs: pct by variable pct
#> Descending By: Factored Sorting
#> Denominators By Variables: colnbr
#> # A tibble: 12 × 9
#> label Active Placebo Comparator row_type nested_level group_level SITEID
#> * <chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <fct>
#> 1 100 1 (50… 1 (50.… 1 (50.0%) NESTED 0 1 100
#> 2 Cardiac d… 1 (50… 1 (50.… 0 NESTED 1 1 100
#> 3 Arrhythmi… 1 (50… 0 0 NESTED 2 1 100
#> 4 Cardiac f… 0 1 (50.… 0 NESTED 2 1 100
#> 5 Respirato… 0 0 1 (50.0%) NESTED 1 1 100
#> 6 Chronic o… 0 0 1 (50.0%) NESTED 2 1 100
#> 7 200 1 (50… 1 (50.… 1 (50.0%) NESTED 0 1 200
#> 8 Infection… 1 (50… 0 1 (50.0%) NESTED 1 1 200
#> 9 Pneumonia 1 (50… 0 0 NESTED 2 1 200
#> 10 Upper res… 0 0 1 (50.0%) NESTED 2 1 200
#> 11 Skin and … 0 1 (50.… 0 NESTED 1 1 200
#> 12 Pustular … 0 1 (50.… 0 NESTED 2 1 200
#> # ℹ 1 more variable: AEBODSYS <fct>
# Cut records where pct meets threshold for a any column
nested_freq(cdisc_adae
,colvar = "TRTA"
,rowvar = "AEBODSYS*AEDECOD"
,statlist = statlist("n (x.x%)", distinct = TRUE)
,cutoff = 2
,cutoff_stat = "n")
#> Column Variables: TRTA
#> Row Variable: AEBODSYS*AEDECOD
#> Statistic Formatting: n (x.x%) TRUE
#> Value Cutoffs: 2 by variable n
#> Descending By: Factored Sorting
#> Denominators By Variables: TRTA
#> # A tibble: 7 × 8
#> label Placebo `Xanomeline High Dose` `Xanomeline Low Dose` row_type
#> * <chr> <chr> <chr> <chr> <chr>
#> 1 GENERAL DISORDE… 2 (40.… 5 (100.0%) 3 (75.0%) NESTED
#> 2 APPLICATION SIT… 1 (20.… 4 (80.0%) 1 (25.0%) NESTED
#> 3 APPLICATION SIT… 1 (20.… 5 (100.0%) 2 (50.0%) NESTED
#> 4 FATIGUE 0 2 (40.0%) 1 (25.0%) NESTED
#> 5 SKIN AND SUBCUT… 2 (40.… 2 (40.0%) 3 (75.0%) NESTED
#> 6 ERYTHEMA 1 (20.… 0 3 (75.0%) NESTED
#> 7 PRURITUS 1 (20.… 0 2 (50.0%) NESTED
#> # ℹ 3 more variables: nested_level <dbl>, group_level <dbl>, AEBODSYS <fct>
# Cut records where pct meets threshold for a specific column
nested_freq(cdisc_adae
,rowvar = "AEBODSYS*AEDECOD"
,colvar = "TRTAN"
,statlist = statlist("n (x.x%)", distinct = TRUE)
,cutoff = "54 >= 2"
,cutoff_stat = "n")
#> Column Variables: TRTAN
#> Row Variable: AEBODSYS*AEDECOD
#> Statistic Formatting: n (x.x%) TRUE
#> Value Cutoffs: 54 >= 2 by variable n
#> Descending By: Factored Sorting
#> Denominators By Variables: TRTAN
#> # A tibble: 5 × 8
#> label `0` `54` `81` row_type nested_level group_level AEBODSYS
#> * <chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <fct>
#> 1 GENERAL DISORDER… 2 (4… 3 (7… 5 (1… NESTED 0 0 GENERAL…
#> 2 APPLICATION SITE… 1 (2… 2 (5… 5 (1… NESTED 1 0 GENERAL…
#> 3 SKIN AND SUBCUTA… 2 (4… 3 (7… 2 (4… NESTED 0 0 SKIN AN…
#> 4 ERYTHEMA 1 (2… 3 (7… 0 NESTED 1 0 SKIN AN…
#> 5 PRURITUS 1 (2… 2 (5… 0 NESTED 1 0 SKIN AN…
# Frequency and percent for two levels of nesting and sort by descending
# active
nested_freq(adae
,colvar = "colnbr"
,rowvar = "AEBODSYS*AEDECOD"
,statlist = statlist("n (x.x%)")
,descending = "Active")
#> Column Variables: colnbr
#> Row Variable: AEBODSYS*AEDECOD
#> Statistic Formatting: n (x.x%)
#> Value Cutoffs: pct by variable pct
#> Descending By: Active
#> Denominators By Variables: colnbr
#> # A tibble: 10 × 8
#> label Active Placebo Comparator row_type nested_level group_level AEBODSYS
#> * <chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <fct>
#> 1 Cardiac… 1 (50… 1 (50.… 0 NESTED 0 0 Cardiac…
#> 2 Arrhyth… 1 (50… 0 0 NESTED 1 0 Cardiac…
#> 3 Cardiac… 0 1 (50.… 0 NESTED 1 0 Cardiac…
#> 4 Infecti… 1 (50… 0 1 (50.0%) NESTED 0 0 Infecti…
#> 5 Pneumon… 1 (50… 0 0 NESTED 1 0 Infecti…
#> 6 Upper r… 0 0 1 (50.0%) NESTED 1 0 Infecti…
#> 7 Respira… 0 0 1 (50.0%) NESTED 0 0 Respira…
#> 8 Chronic… 0 0 1 (50.0%) NESTED 1 0 Respira…
#> 9 Skin an… 0 1 (50.… 0 NESTED 0 0 Skin an…
#> 10 Pustula… 0 1 (50.… 0 NESTED 1 0 Skin an…
# Below illustrates how make the same calls to nested_freq() as above, using
# table and # column metadata along with generate_results().
column_metadata <- tibble::tribble(
~tbltype, ~coldef, ~decode,
"type1", "1", "Placebo",
"type1", "2", "Low",
"type1", "3", "High"
)
# Frequency and percent for two levels of nesting
table_metadata <- tibble::tribble(
~anbr, ~func, ~df, ~rowvar, ~tbltype, ~colvar, ~statlist,
"1", "nested_freq", "cdisc_adae", "AEBODSYS*AEDECOD", "type1", "TRTP",
statlist("n (x.x%)")
)
#generate_results(table_metadata,
#column_metadata_file = tidytlg_metadata(path)
# Frequency and percent for three levels of nesting (for illustrative purpose)
table_metadata <- tibble::tribble(
~anbr, ~func, ~df, ~rowvar, ~tbltype, ~colvar,
~statlist,
"1", "nested_freq", "cdisc_adae", "SITEID*AEBODSYS*AEDECOD","type1",
"TRTP", statlist("n (x.x%)")
)
# Commented out because it takes too long
# generate_results(table_metadata, column_metadata)
#Cut records where pct meets threshold for a any column
column_metadata <- tibble::tribble(
~tbltype, ~coldef, ~decode,
"type2", "1", "Placebo",
"type2", "2", "Active"
)
table_metadata <- tibble::tibble(
anbr = "1", func = "nested_freq", df= "cdisc_adae",
rowvar = "AEBODSYS*AEDECOD",
tbltype = "type2", colvar = "TRTP", statlist = statlist("n (x.x%)"),
dotdotdot = "cutoff = 5"
)
#generate_results(table_metadata,
# column_metadata_file = tidytlg_metadata(path)
# Cut records where pct meets threshold for a specific column
table_metadata <- tibble::tibble(
anbr = "1", func = "nested_freq", df= "cdisc_adae",
rowvar = "AEBODSYS*AEDECOD",
tbltype = "type2", colvar = "TRTP", statlist = statlist("n (x.x%)"),
dotdotdot = "cutoff = 'col1 >= 5'"
)
#generate_results(table_metadata,
#column_metadata_file = tidytlg_metadata(path)
# Frequency and percent for two levels of nesting and sort by descending col1
table_metadata <- tibble::tibble(
anbr = "1", func = "nested_freq", df= "cdisc_adae",
rowvar = "AEBODSYS*AEDECOD",
tbltype = "type2", colvar = "TRTP", statlist = statlist("n (x.x%)"),
dotdotdot = "descending = 'col1'"
)
#generate_results(table_metadata,
#column_metadata_file = tidytlg_metadata(path)