R-CMD-check CRAN status Codecov test coverage DOI:10.32614/RJ-2021-053

gtsummary

The {gtsummary} package provides an elegant and flexible way to create publication-ready analytical and summary tables using the R programming language. The {gtsummary} package summarizes data sets, regression models, and more, using sensible defaults with highly customizable capabilities.

By leveraging {broom}, {gt}, and {labelled} packages, {gtsummary} creates beautifully formatted, ready-to-share summary and result tables in a single line of R code!

Check out the examples below, review the vignettes for a detailed exploration of the output options, and view the gallery for various customization examples.

Installation

The {gtsummary} package was written as a companion to the {gt} package from RStudio. You can install {gtsummary} with the following code.

install.packages("gtsummary")

Install the development version of {gtsummary} with:

remotes::install_github("ddsjoberg/gtsummary")

Examples

Summary Table

Use tbl_summary() to summarize a data frame.

animated

Example basic table:

library(gtsummary)
# make dataset with a few variables to summarize
trial2 <- trial %>% select(age, grade, response, trt)

# summarize the data with our package
table1 <- tbl_summary(trial2)

There are many customization options to add information (like comparing groups) and format results (like bold labels) in your table. See the tbl_summary() tutorial for many more options, or below for one example.

table2 <- 
  tbl_summary(
    trial2,
    by = trt, # split table by group
    missing = "no" # don't list missing data separately
  ) %>%
  add_n() %>% # add column with total number of non-missing observations
  add_p() %>% # test for a difference between groups
  modify_header(label = "**Variable**") %>% # update the column header
  bold_labels() 

Regression Models

Use tbl_regression() to easily and beautifully display regression model results in a table. See the tutorial for customization options.

mod1 <- glm(response ~ trt + age + grade, trial, family = binomial)

t1 <- tbl_regression(mod1, exponentiate = TRUE)

Side-by-side Regression Models

You can also present side-by-side regression model results using tbl_merge()

library(survival)

# build survival model table
t2 <-
  coxph(Surv(ttdeath, death) ~ trt + grade + age, trial) %>%
  tbl_regression(exponentiate = TRUE)

# merge tables 
tbl_merge_ex1 <-
  tbl_merge(
    tbls = list(t1, t2),
    tab_spanner = c("**Tumor Response**", "**Time to Death**")
  )

Review even more output options in the table gallery.

gtsummary + R Markdown

The {gtsummary} package was written to be a companion to the {gt} package from RStudio. But not all output types are supported by the {gt} package. Therefore, we have made it possible to print {gtsummary} tables with various engines.

Review the gtsummary + R Markdown vignette for details.

Save Individual Tables

{gtsummary} tables can also be saved directly to file as an image, RTF, LaTeX, and Word file.

tbl %>%
  as_gt() %>%
  gt::gtsave(filename = ".") # use extensions .html .tex .ltx .rtf

For a Word file, use

tbl %>%
  as_flex_table() %>%
  flextable::save_as_docx()

Additional Resources

Cite gtsummary

> citation("gtsummary")

To cite gtsummary in publications use:

  Sjoberg DD, Whiting K, Curry M, Lavery JA, Larmarange J. Reproducible summary tables with the gtsummary package.
  The R Journal 2021;13:570–80. https://doi.org/10.32614/RJ-2021-053.

A BibTeX entry for LaTeX users is

  @Article{gtsummary,
    author = {Daniel D. Sjoberg and Karissa Whiting and Michael Curry and Jessica A. Lavery and Joseph Larmarange},
    title = {Reproducible Summary Tables with the gtsummary Package},
    journal = {{The R Journal}},
    year = {2021},
    url = {https://doi.org/10.32614/RJ-2021-053},
    doi = {10.32614/RJ-2021-053},
    volume = {13},
    issue = {1},
    pages = {570-580},
  }

Contributing

Big thank you to [@jeffreybears](https://www.jeffreybears.com/) for the hex sticker!

Please note that the {gtsummary} project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms. Thank you to all contributors!
[@ablack3](https://github.com/ablack3), [@ABorakati](https://github.com/ABorakati), [@aghaynes](https://github.com/aghaynes), [@ahinton-mmc](https://github.com/ahinton-mmc), [@akefley](https://github.com/akefley), [@albertostefanelli](https://github.com/albertostefanelli), [@alexis-catherine](https://github.com/alexis-catherine), [@amygimma](https://github.com/amygimma), [@anaavu](https://github.com/anaavu), [@andrader](https://github.com/andrader), [@angelgar](https://github.com/angelgar), [@arbet003](https://github.com/arbet003), [@arnmayer](https://github.com/arnmayer), [@asshah4](https://github.com/asshah4), [@awcm0n](https://github.com/awcm0n), [@barthelmes](https://github.com/barthelmes), [@BeauMeche](https://github.com/BeauMeche), [@benediktclaus](https://github.com/benediktclaus), [@brachem-christian](https://github.com/brachem-christian), [@bwiernik](https://github.com/bwiernik), [@bx259](https://github.com/bx259), [@calebasaraba](https://github.com/calebasaraba), [@CarolineXGao](https://github.com/CarolineXGao), [@Chris-M-P](https://github.com/Chris-M-P), [@chrisleitzinger](https://github.com/chrisleitzinger), [@cjprobst](https://github.com/cjprobst), [@clmawhorter](https://github.com/clmawhorter), [@CodieMonster](https://github.com/CodieMonster), [@coeus-analytics](https://github.com/coeus-analytics), [@coreysparks](https://github.com/coreysparks), [@ctlamb](https://github.com/ctlamb), [@davidgohel](https://github.com/davidgohel), [@davidkane9](https://github.com/davidkane9), [@dax44](https://github.com/dax44), [@ddsjoberg](https://github.com/ddsjoberg), [@DeFilippis](https://github.com/DeFilippis), [@denis-or](https://github.com/denis-or), [@dieuv0](https://github.com/dieuv0), [@discoleo](https://github.com/discoleo), [@djbirke](https://github.com/djbirke), [@dmenne](https://github.com/dmenne), [@eamoncaddigan](https://github.com/eamoncaddigan), [@ElfatihHasabo](https://github.com/ElfatihHasabo), [@emilyvertosick](https://github.com/emilyvertosick), [@ercbk](https://github.com/ercbk), [@erikvona](https://github.com/erikvona), [@eweisbrod](https://github.com/eweisbrod), [@feizhadj](https://github.com/feizhadj), [@fh-jsnider](https://github.com/fh-jsnider), [@gjones1219](https://github.com/gjones1219), [@gorkang](https://github.com/gorkang), [@GuiMarthe](https://github.com/GuiMarthe), [@hass91](https://github.com/hass91), [@hughjonesd](https://github.com/hughjonesd), [@iaingallagher](https://github.com/iaingallagher), [@ilyamusabirov](https://github.com/ilyamusabirov), [@IndrajeetPatil](https://github.com/IndrajeetPatil), [@IsadoraBM](https://github.com/IsadoraBM), [@j-tamad](https://github.com/j-tamad), [@jalavery](https://github.com/jalavery), [@jeanmanguy](https://github.com/jeanmanguy), [@jemus42](https://github.com/jemus42), [@jennybc](https://github.com/jennybc), [@JeremyPasco](https://github.com/JeremyPasco), [@JesseRop](https://github.com/JesseRop), [@jflynn264](https://github.com/jflynn264), [@jjallaire](https://github.com/jjallaire), [@joelgautschi](https://github.com/joelgautschi), [@jojosgithub](https://github.com/jojosgithub), [@JonGretar](https://github.com/JonGretar), [@juseer](https://github.com/juseer), [@jwilliman](https://github.com/jwilliman), [@karissawhiting](https://github.com/karissawhiting), [@kmdono02](https://github.com/kmdono02), [@kwakuduahc1](https://github.com/kwakuduahc1), [@larmarange](https://github.com/larmarange), [@leejasme](https://github.com/leejasme), [@loukesio](https://github.com/loukesio), [@lspeetluk](https://github.com/lspeetluk), [@ltin1214](https://github.com/ltin1214), [@lucavd](https://github.com/lucavd), [@LuiNov](https://github.com/LuiNov), [@maia-sh](https://github.com/maia-sh), [@Marsus1972](https://github.com/Marsus1972), [@matthieu-faron](https://github.com/matthieu-faron), [@mbac](https://github.com/mbac), [@mdidish](https://github.com/mdidish), [@MelissaAssel](https://github.com/MelissaAssel), [@michaelcurry1123](https://github.com/michaelcurry1123), [@mljaniczek](https://github.com/mljaniczek), [@moleps](https://github.com/moleps), [@mvuorre](https://github.com/mvuorre), [@MyKo101](https://github.com/MyKo101), [@oranwutang](https://github.com/oranwutang), [@palantre](https://github.com/palantre), [@Pascal-Schmidt](https://github.com/Pascal-Schmidt), [@philsf](https://github.com/philsf), [@polc1410](https://github.com/polc1410), [@proshano](https://github.com/proshano), [@raphidoc](https://github.com/raphidoc), [@roman2023](https://github.com/roman2023), [@ryzhu75](https://github.com/ryzhu75), [@sachijay](https://github.com/sachijay), [@sammo3182](https://github.com/sammo3182), [@sbalci](https://github.com/sbalci), [@shannonpileggi](https://github.com/shannonpileggi), [@shengchaohou](https://github.com/shengchaohou), [@ShixiangWang](https://github.com/ShixiangWang), [@simonpcouch](https://github.com/simonpcouch), [@slb2240](https://github.com/slb2240), [@slobaugh](https://github.com/slobaugh), [@StaffanBetner](https://github.com/StaffanBetner), [@Stephonomon](https://github.com/Stephonomon), [@storopoli](https://github.com/storopoli), [@tamytsujimoto](https://github.com/tamytsujimoto), [@TarJae](https://github.com/TarJae), [@THIB20](https://github.com/THIB20), [@tjmeyers](https://github.com/tjmeyers), [@tldrcharlene](https://github.com/tldrcharlene), [@tormodb](https://github.com/tormodb), [@toshifumikuroda](https://github.com/toshifumikuroda), [@UAB-BST-680](https://github.com/UAB-BST-680), [@uakimix](https://github.com/uakimix), [@uriahf](https://github.com/uriahf), [@xkcococo](https://github.com/xkcococo), [@yonicd](https://github.com/yonicd), [@zabore](https://github.com/zabore), [@zachariae](https://github.com/zachariae), [@zeyunlu](https://github.com/zeyunlu), [@zhengnow](https://github.com/zhengnow), [@zlkrvsm](https://github.com/zlkrvsm), and [@zongell-star](https://github.com/zongell-star)