This function provides a convenience interface for generating generalizations of a 2-way frequency table. Row and column space can be facetted by variables, and an analysis function can be specified. The function then builds a layout with the specified layout and applies it to the data provided.
Usage
qtable_layout(
data,
row_vars = character(),
col_vars = character(),
avar = NULL,
row_labels = NULL,
afun = NULL,
summarize_groups = FALSE,
title = "",
subtitles = character(),
main_footer = character(),
prov_footer = character(),
show_colcounts = TRUE,
drop_levels = TRUE,
...,
.default_rlabel = NULL
)
qtable(
data,
row_vars = character(),
col_vars = character(),
avar = NULL,
row_labels = NULL,
afun = NULL,
summarize_groups = FALSE,
title = "",
subtitles = character(),
main_footer = character(),
prov_footer = character(),
show_colcounts = TRUE,
drop_levels = TRUE,
...
)
Arguments
- data
(
data.frame
)
the data to tabulate.- row_vars
(
character
)
the names of variables to be used in row facetting.- col_vars
(
character
)
the names of variables to be used in column facetting.- avar
(
string
)
the variable to be analyzed. Defaults to the first variable indata
.- row_labels
(
character
orNULL
)
row label(s) which should be applied to the analysis rows. Length must match the number of rows generated byafun
.- afun
(
function
)
the function to generate the analysis row cell values. This can be a proper analysis function, or a function which returns a vector or list. Vectors are taken as multi-valued single cells, whereas lists are interpreted as multiple cells.- summarize_groups
(
flag
)
whether each level of nesting should include marginal summary rows. Defaults toFALSE
.- title
(
string
)
single string to use as main title (main_title()
). Ignored for subtables.- subtitles
(
character
)
a vector of strings to use as subtitles (subtitles()
), where every element is printed on a separate line. Ignored for subtables.- main_footer
(
character
)
a vector of strings to use as main global (non-referential) footer materials (main_footer()
), where every element is printed on a separate line.- prov_footer
(
character
)
a vector of strings to use as provenance-related global footer materials (prov_footer()
), where every element is printed on a separate line.- show_colcounts
(
flag
)
whether column counts should be displayed in the resulting table when this layout is applied to data.- drop_levels
(
flag
)
whether unobserved factor levels should be dropped during facetting. Defaults toTRUE
.- ...
additional arguments passed to
afun
.- .default_rlabel
(
string
)
this is an implementation detail that should not be set by end users.
Value
qtable
returns a builtTableTree
object representing the desired tableqtable_layout
returns aPreDataTableLayouts
object declaring the structure of the desired table, suitable for passing tobuild_table()
.
Details
This function creates a table with a single top-level structure in both row and column dimensions involving faceting by 0 or more variables in each dimension.
The display of the table depends on certain details of the tabulation. In the case of an afun
which returns a
single cell's contents (either a scalar or a vector of 2 or 3 elements), the label rows for the deepest-nested row
facets will be hidden and the labels used there will be used as the analysis row labels. In the case of an afun
which returns a list (corresponding to multiple cells), the names of the list will be used as the analysis row
labels and the deepest-nested facet row labels will be visible.
The table will be annotated in the top-left area with an informative label displaying the analysis variable
(avar
), if set, and the function used (captured via substitute) where possible, or 'count' if not. One exception
where the user may directly modify the top-left area (via row_labels
) is the case of a table with row facets and
an afun
which returns a single row.
Examples
qtable(ex_adsl)
#> all obs
#> (N=400)
#> ———————————————
#> count 400
qtable(ex_adsl, row_vars = "ARM")
#> all obs
#> count (N=400)
#> ————————————————————————
#> A: Drug X 134
#> B: Placebo 134
#> C: Combination 132
qtable(ex_adsl, col_vars = "ARM")
#> A: Drug X B: Placebo C: Combination
#> (N=134) (N=134) (N=132)
#> ———————————————————————————————————————————————
#> count 134 134 132
qtable(ex_adsl, row_vars = "SEX", col_vars = "ARM")
#> A: Drug X B: Placebo C: Combination
#> count (N=134) (N=134) (N=132)
#> ——————————————————————————————————————————————————————————
#> F 79 77 66
#> M 51 55 60
#> U 3 2 4
#> UNDIFFERENTIATED 1 0 2
qtable(ex_adsl, row_vars = c("COUNTRY", "SEX"), col_vars = c("ARM", "STRATA1"))
#> A: Drug X B: Placebo C: Combination
#> A B C A B C A B C
#> count (N=38) (N=47) (N=49) (N=44) (N=45) (N=45) (N=40) (N=43) (N=49)
#> ———————————————————————————————————————————————————————————————————————————————————————————————————
#> CHN
#> F 11 15 18 12 15 18 8 9 12
#> M 9 7 11 8 12 15 10 10 10
#> U 1 0 1 1 0 0 1 0 2
#> UNDIFFERENTIATED 0 0 1 0 0 0 1 0 1
#> USA
#> F 1 3 3 1 4 3 2 4 4
#> M 1 2 0 3 1 1 1 3 3
#> BRA
#> F 3 1 1 2 1 0 0 3 2
#> M 1 7 0 4 0 0 2 3 0
#> PAK
#> F 3 1 4 4 0 0 2 1 1
#> M 2 1 1 2 2 1 1 3 2
#> NGA
#> F 0 1 2 2 1 2 1 0 4
#> M 2 1 1 0 1 1 4 1 1
#> U 0 1 0 0 0 0 0 0 0
#> RUS
#> F 0 2 2 2 1 2 1 1 2
#> M 1 0 0 1 1 1 0 0 1
#> U 0 0 0 0 0 0 0 1 0
#> JPN
#> F 1 1 2 0 2 1 3 2 2
#> M 0 1 0 0 0 0 1 0 1
#> U 0 0 0 0 1 0 0 0 0
#> GBR
#> F 1 0 1 0 2 0 0 1 0
#> M 0 1 1 1 0 0 0 0 1
#> CAN
#> F 1 1 0 1 1 0 1 0 0
#> M 0 1 0 0 0 0 1 1 0
qtable(ex_adsl,
row_vars = c("COUNTRY", "SEX"),
col_vars = c("ARM", "STRATA1"), avar = "AGE", afun = mean
)
#> A: Drug X B: Placebo C: Combination
#> A B C A B C A B C
#> AGE - mean (N=38) (N=47) (N=49) (N=44) (N=45) (N=45) (N=40) (N=43) (N=49)
#> ———————————————————————————————————————————————————————————————————————————————————————————————————
#> CHN
#> F 31.09 30.67 32.56 33.08 35.73 35.28 35.25 33.89 35.75
#> M 34.44 36.43 35.73 38.38 35.25 37.60 30.80 35.20 38.60
#> U 33.00 NA 34.00 27.00 NA NA 38.00 NA 33.00
#> UNDIFFERENTIATED NA NA 28.00 NA NA NA 44.00 NA 46.00
#> USA
#> F 24.00 38.00 35.00 46.00 40.75 32.33 36.50 30.50 36.00
#> M 40.00 34.50 NA 38.67 53.00 30.00 47.00 38.00 29.00
#> BRA
#> F 35.33 38.00 44.00 27.50 25.00 NA NA 46.33 33.00
#> M 43.00 35.14 NA 36.00 NA NA 28.50 40.33 NA
#> PAK
#> F 28.00 38.00 29.50 30.75 NA NA 33.00 23.00 49.00
#> M 39.00 37.00 31.00 41.50 28.50 33.00 40.00 35.33 35.50
#> NGA
#> F NA 25.00 35.00 26.50 37.00 32.00 31.00 NA 32.75
#> M 29.50 29.00 50.00 NA 40.00 24.00 34.50 32.00 28.00
#> U NA 28.00 NA NA NA NA NA NA NA
#> RUS
#> F NA 36.50 39.50 31.00 36.00 39.50 30.00 44.00 26.00
#> M 40.00 NA NA 36.00 58.00 29.00 NA NA 28.00
#> U NA NA NA NA NA NA NA 37.00 NA
#> JPN
#> F 29.00 34.00 37.50 NA 29.00 28.00 32.33 47.50 34.00
#> M NA 48.00 NA NA NA NA 45.00 NA 26.00
#> U NA NA NA NA 35.00 NA NA NA NA
#> GBR
#> F 28.00 NA 36.00 NA 28.00 NA NA 40.00 NA
#> M NA 27.00 28.00 62.00 NA NA NA NA 69.00
#> CAN
#> F 41.00 39.00 NA 34.00 43.00 NA 37.00 NA NA
#> M NA 31.00 NA NA NA NA 36.00 32.00 NA
summary_list <- function(x, ...) as.list(summary(x))
qtable(ex_adsl, row_vars = "SEX", col_vars = "ARM", avar = "AGE", afun = summary_list)
#> A: Drug X B: Placebo C: Combination
#> AGE - summary_list (N=134) (N=134) (N=132)
#> ————————————————————————————————————————————————————————————
#> F
#> Min. 21.00 23.00 21.00
#> 1st Qu. 28.00 29.00 31.25
#> Median 32.00 32.00 35.00
#> Mean 32.76 34.12 35.20
#> 3rd Qu. 37.00 37.00 38.00
#> Max. 47.00 58.00 64.00
#> M
#> Min. 23.00 21.00 20.00
#> 1st Qu. 29.50 32.50 29.00
#> Median 37.00 37.00 33.50
#> Mean 35.57 37.44 35.38
#> 3rd Qu. 40.50 41.50 40.00
#> Max. 50.00 62.00 69.00
#> U
#> Min. 28.00 27.00 31.00
#> 1st Qu. 30.50 29.00 34.00
#> Median 33.00 31.00 36.00
#> Mean 31.67 31.00 35.25
#> 3rd Qu. 33.50 33.00 37.25
#> Max. 34.00 35.00 38.00
#> UNDIFFERENTIATED
#> Min. 28.00 NA 44.00
#> 1st Qu. 28.00 NA 44.50
#> Median 28.00 NA 45.00
#> Mean 28.00 NA 45.00
#> 3rd Qu. 28.00 NA 45.50
#> Max. 28.00 NA 46.00
suppressWarnings(qtable(ex_adsl,
row_vars = "SEX",
col_vars = "ARM", avar = "AGE", afun = range
))
#> A: Drug X B: Placebo C: Combination
#> AGE - range (N=134) (N=134) (N=132)
#> —————————————————————————————————————————————————————————————
#> F 21.0 / 47.0 23.0 / 58.0 21.0 / 64.0
#> M 23.0 / 50.0 21.0 / 62.0 20.0 / 69.0
#> U 28.0 / 34.0 27.0 / 35.0 31.0 / 38.0
#> UNDIFFERENTIATED 28.0 / 28.0 Inf / -Inf 44.0 / 46.0