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.
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
character(1). The variable to be analyzed. Defaults to the first variable in
data
.- row_labels
character or NULL. Row label(s) which should be applied to the analysis rows. length must match the number of rows generated by
afun
.- 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
logical(1). Should each level of nesting include marginal summary rows. Defaults to
FALSE
- title
character(1). Main title. Ignored for subtables.
- subtitles
character. Subtitles. Ignored for subtables.
- main_footer
character. Main global (non-referential) footer materials.
- prov_footer
character. Provenance-related global footer materials. Generally should not be modified by hand.
- show_colcounts
logical(1). Should column counts be displayed in the resulting table when this layout is applied to data
- drop_levels
logical(1). Should unobserved factor levels be dropped during facetting. Defaults to
TRUE
.- ...
passed to
afun
, if specified. Otherwise ignored.
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.
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 row labels will not be hidden.
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.
Examples
qtable(ex_adsl)
#> all obs
#> (N=400)
#> ———————————————
#> count 400
qtable(ex_adsl, row_vars = "ARM")
#> count all obs
#> (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")
#> count A: Drug X B: Placebo C: Combination
#> (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"))
#> count A: Drug X B: Placebo C: Combination
#> A B C A B C A B C
#> (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)
#> AGE - mean A: Drug X B: Placebo C: Combination
#> A B C A B C A B C
#> (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)
#> AGE - summary_list A: Drug X B: Placebo C: Combination
#> (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))
#> AGE - range A: Drug X B: Placebo C: Combination
#> (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