build_table {rtables} | R Documentation |
Create a table from a layout and data
Description
Layouts are used to describe a table pre-data. build_table
is used to create a table
using a layout and a dataset.
Usage
build_table(
lyt,
df,
alt_counts_df = NULL,
col_counts = NULL,
col_total = if (is.null(alt_counts_df)) nrow(df) else nrow(alt_counts_df),
topleft = NULL,
hsep = default_hsep(),
...
)
Arguments
lyt |
( |
df |
( |
alt_counts_df |
( |
col_counts |
( |
col_total |
( |
topleft |
( |
hsep |
( |
... |
ignored. |
Details
When alt_counts_df
is specified, column counts are calculated by applying the exact column subsetting
expressions determined when applying column splitting to the main data (df
) to alt_counts_df
and
counting the observations in each resulting subset.
In particular, this means that in the case of splitting based on cuts of the data, any dynamic cuts will have
been calculated based on df
and simply re-used for the count calculation.
Value
A TableTree
or ElementaryTable
object representing the table created by performing the tabulations
declared in lyt
to the data df
.
Note
When overriding the column counts or totals care must be taken that, e.g., length()
or nrow()
are not called
within tabulation functions, because those will NOT give the overridden counts. Writing/using tabulation
functions which accept .N_col
and .N_total
or do not rely on column counts at all (even implicitly) is the
only way to ensure overridden counts are fully respected.
Author(s)
Gabriel Becker
Examples
lyt <- basic_table() %>%
split_cols_by("Species") %>%
analyze("Sepal.Length", afun = function(x) {
list(
"mean (sd)" = rcell(c(mean(x), sd(x)), format = "xx.xx (xx.xx)"),
"range" = diff(range(x))
)
})
lyt
tbl <- build_table(lyt, iris)
tbl
# analyze multiple variables
lyt2 <- basic_table() %>%
split_cols_by("Species") %>%
analyze(c("Sepal.Length", "Petal.Width"), afun = function(x) {
list(
"mean (sd)" = rcell(c(mean(x), sd(x)), format = "xx.xx (xx.xx)"),
"range" = diff(range(x))
)
})
tbl2 <- build_table(lyt2, iris)
tbl2
# an example more relevant for clinical trials with column counts
lyt3 <- basic_table(show_colcounts = TRUE) %>%
split_cols_by("ARM") %>%
analyze("AGE", afun = function(x) {
setNames(as.list(fivenum(x)), c(
"minimum", "lower-hinge", "median",
"upper-hinge", "maximum"
))
})
tbl3 <- build_table(lyt3, DM)
tbl3
tbl4 <- build_table(lyt3, subset(DM, AGE > 40))
tbl4
# with column counts calculated based on different data
miniDM <- DM[sample(1:NROW(DM), 100), ]
tbl5 <- build_table(lyt3, DM, alt_counts_df = miniDM)
tbl5
tbl6 <- build_table(lyt3, DM, col_counts = 1:3)
tbl6