The tbl_summary
function calculates descriptive statistics for
continuous, categorical, and dichotomous variables. Review the
tbl_summary vignette
for detailed examples.
tbl_summary( data, by = NULL, label = NULL, statistic = NULL, digits = NULL, type = NULL, value = NULL, missing = NULL, missing_text = NULL, sort = NULL, percent = NULL, include = everything(), group = NULL )
data  A data frame 

by  A column name (quoted or unquoted) in 
label  List of formulas specifying variables labels,
e.g. 
statistic  List of formulas specifying types of summary statistics to
display for each variable. The default is

digits  List of formulas specifying the number of decimal
places to round continuous summary statistics. If not specified,

type  List of formulas specifying variable types. Accepted values
are 
value  List of formulas specifying the value to display for dichotomous variables. See below for details. 
missing  Indicates whether to include counts of 
missing_text  String to display for count of missing observations.
Default is 
sort  List of formulas specifying the type of sorting to perform for
categorical data. Options are 
percent  Indicates the type of percentage to return. Must be one of

include  variables to include in the summary table. Default is 
group  DEPRECATED. Migrated to add_p 
A tbl_summary
object
Select helpers
from the \tidyselect\ package and \gtsummary\ package are available to
modify default behavior for groups of variables.
For example, by default continuous variables are reported with the median
and IQR. To change all continuous variables to mean and standard deviation use
statistic = list(all_continuous() ~ "{mean} ({sd})")
.
All columns with class logical are displayed as dichotomous variables showing
the proportion of events that are TRUE
on a single row. To show both rows
(i.e. a row for TRUE
and a row for FALSE
) use
type = list(all_logical() ~ "categorical")
.
The select helpers are available for use in any argument that accepts a list
of formulas (e.g. statistic
, type
, digits
, value
, sort
, etc.)
The tbl_summary()
function has four summary types:
"continuous"
summaries are shown on a single row. Most numeric
variables default to summary type continuous.
"continuous2"
summaries are shown on 2 or more rows
"categorical"
multiline summaries of nominal data. Character variables,
factor variables, and numeric variables with fewer than 10 unique levels default to
type categorical. To change a numeric variable to continuous that
defaulted to categorical, use type = list(varname ~ "continuous")
"dichotomous"
categorical variables that are displayed on a single row,
rather than one row per level of the variable.
Variables coded as TRUE
/FALSE
, 0
/1
, or yes
/no
are assumed to be dichotomous,
and the TRUE
, 1
, and yes
rows are displayed.
Otherwise, the value to display must be specified in the value
argument, e.g. value = list(varname ~ "level to show")
The statistic argument specifies the statistics presented in the table. The
input is a list of formulas that specify the statistics to report. For example,
statistic = list(age ~ "{mean} ({sd})")
would report the mean and
standard deviation for age; statistic = list(all_continuous() ~ "{mean} ({sd})")
would report the mean and standard deviation for all continuous variables.
A statistic name that appears between curly brackets
will be replaced with the numeric statistic (see glue::glue).
For categorical variables the following statistics are available to display.
{n}
frequency
{N}
denominator, or cohort size
{p}
formatted percentage
For continuous variables the following statistics are available to display.
{median}
median
{mean}
mean
{sd}
standard deviation
{var}
variance
{min}
minimum
{max}
maximum
{p##}
any integer percentile, where ##
is an integer from 0 to 100
{foo}
any function of the form foo(x)
is accepted where x
is a numeric vector
When the summary type is "continuous2"
, pass a vector of statistics. Each element
of the vector will result in a separate row in the summary table.
For both categorical and continuous variables, statistics on the number of missing and nonmissing observations and their proportions are available to display.
{N_obs}
total number of observations
{N_miss}
number of missing observations
{N_nonmiss}
number of nonmissing observations
{p_miss}
percentage of observations missing
{p_nonmiss}
percentage of observations not missing
Note that for categorical variables, {N_obs}
, {N_miss}
and {N_nonmiss}
refer
to the total number, number missing and number non missing observations
in the denominator, not at each level of the categorical variable.
Example 1
Example 2
Example 3
Example 4
See tbl_summary vignette for detailed tutorial
See table gallery for additional examples
Other tbl_summary tools:
add_n.tbl_summary()
,
add_overall()
,
add_p.tbl_summary()
,
add_q()
,
add_stat_label()
,
bold_italicize_labels_levels
,
inline_text.tbl_summary()
,
inline_text.tbl_survfit()
,
modify
,
tbl_merge()
,
tbl_stack()
Daniel D. Sjoberg
# Example 1  tbl_summary_ex1 < trial %>% select(age, grade, response) %>% tbl_summary() # Example 2  tbl_summary_ex2 < trial %>% select(age, grade, response, trt) %>% tbl_summary( by = trt, label = list(age ~ "Patient Age"), statistic = list(all_continuous() ~ "{mean} ({sd})"), digits = list(age ~ c(0, 1)) ) # Example 3  # for convenience, you can also pass named lists to any arguments # that accept formulas (e.g label, digits, etc.) tbl_summary_ex3 < trial %>% select(age, trt) %>% tbl_summary( by = trt, label = list(age = "Patient Age") ) # Example 4  # multiline summaries of continuous data with type 'continuous2' tbl_summary_ex4 < trial %>% select(age, marker) %>% tbl_summary( type = all_continuous() ~ "continuous2", statistic = all_continuous() ~ c("{median} ({p25}, {p75})", "{min}, {max}"), missing = "no" )