---
title: "GT Demo - Part 2 - more elaborate"
author: "John D. Smith"
date: "10/16/2020"
output: html_document
---
## Resources:
-
-
-
## Load libraries
```{r}
suppressPackageStartupMessages(library(tidyverse))
library(gt)
```
This demo meanders from the outside and top of a table and works its way in. At the end we explore how to use the output.
![](img/gt_parts_of_a_table.svg)
# The tour
## Continue with `gtcars`
We'll use the `gtcars` data frame including cars from all countries.
```{r}
glimpse(gtcars)
```
`gt` interacts with `dplyr` groups in interesting ways.
```{r}
mileage <- gtcars %>%
group_by(year, ctry_origin, bdy_style) %>%
summarize(n = n(), hp_mean = mean(hp), mpg_h_mean = mean(mpg_h))
```
## `group_by` is a natural
The last variable in the `group_by` becomes a row label and the others are concatenated into a block label.
```{r}
t <- mileage %>%
gt()
t
```
We'll use a simpler grouping in subsequent examples. Just passing a grouped data frame produces a table with a more complicated structure than an un-grouped data frame.
```{r}
mileage <- gtcars %>%
group_by(ctry_origin, bdy_style) %>%
summarize(n = n(),
hp_mean = mean(hp),
mpg_h_mean = mean(mpg_h))
t <- mileage %>%
gt()
t
```
## A bestiary of functions to format columns
`gt` provides the following `fmt_` functions:
- `fmt_currency()`
- `fmt_date()`
- `fmt_datetime()`
- `fmt_markdown()`
- `fmt_missing()`
- `fmt_number()`
- `fmt_passthrough()`
- `fmt_percent()`
- `fmt_scientific()`
- `fmt_time()`
```{r}
t <- t %>%
fmt_number(vars(n, hp_mean, mpg_h_mean),
decimals = 0)
t
```
## Many `cols_` functions to manipulate columns
- `cols_align()`
- `cols_hide()`
- `cols_label()`
- `cols_merge()`
- `cols_merge_range()`
- `cols_merge_uncert()`
- `cols_move()`
- `cols_move_to_end()`
- `cols_move_to_start()`
- `cols_width()`
Nice labels for columns, except that labeling the `group_by` seems to have no effect.
```{r}
t <- t %>%
cols_label(
bdy_style = "Style",
hp_mean = html("Horse
Power
Mean"),
mpg_h_mean = html("Highway
MPG
Mean"),
n = html("Number
of
Models"),
ctry_origin = "Country"
)
t
```
- `tab_footnote()`
- `tab_header()`
- `tab_options()`
- `tab_row_group()`
- `tab_source_note()`
- `tab_spanner()`
- `tab_spanner_delim()`
- `tab_stubhead()`
- `tab_style()`
The `tab_spanner()` function helps describe the table's contents, but doesn't improve the labeling of the grouping variable.
```{r}
t <- t %>%
tab_spanner(
label = "Mean",
columns = vars(
hp_mean, mpg_h_mean)
) %>%
tab_spanner(
label = "Count",
columns = vars(n)
) %>%
cols_label(
bdy_style = "Style",
hp_mean = html("Horse
Power"),
mpg_h_mean = html("Highway
MPG"),
n = html("Models"),
ctry_origin = "Country"
)
t
```
## Footnotes
Explanatory footnotes on individual cells can be specified in several ways.
```{r}
t <- t %>%
tab_footnote(
footnote = "Highest horsepower group of all.",
locations = cells_body(
columns = vars(hp_mean),
rows = hp_mean == max(hp_mean))
)
t
```
Footnotes appear in order on the table, not in the order they are specified:
```{r}
t <- t %>%
tab_footnote(
footnote = "Best overall gas mileage.",
locations = cells_body(
columns = vars(mpg_h_mean),
rows = mpg_h_mean == 27.5)
)
t
```
## Saving a `gt` table
The HTML file that `gtsave()` generates is easy to copy and paste into a Google Doc. The supported file extensions / file types are: `.html`, `.png`, `pdf`, `.tex`, `.ltx`, `.rtf`. In my, the `.png` files are not very easy to work with.
```{r}
gtsave(t, "gtdemo_table.html")
```
Here is a problem that I have not solved. Formatting totals at the bottom of a table.
```{r}
tm <- mileage %>%
gt(groupname_col = vars("bdy_style")) %>%
tab_spanner(
label = "Mean",
columns = vars(
hp_mean, mpg_h_mean)
) %>%
tab_spanner(
label = "Count",
columns = vars(n)
) %>%
cols_label(
bdy_style = "Style",
hp_mean = html("Horse
Power"),
mpg_h_mean = html("Highway
MPG"),
n = html("Models"),
ctry_origin = "Country"
) %>%
summary_rows(groups = NULL,
columns = vars(n),
fns = list(sum = ~sum(.))) %>%
# formatter = fmt_number(.)) %>%
fmt_number(vars(n, hp_mean, mpg_h_mean),
decimals = 0)
tm
```
# More resources
Here are some more in-depth resources about tables and `gt` in particular:
- Tom Mock ([\@thomas\_mock](https://twitter.com/thomas_mock)) presentation on [Beautiful Tables in R; gt and the grammar of tables](https://themockup.blog/static/slides/intro-tables.html#1).
- [Table Talk](http://www.storytellingwithdata.com/blog/2020/10/27/table-talkhttp://www.storytellingwithdata.com/blog/2020/10/27/table-talk) - [Alex Velez](http://www.storytellingwithdata.com/blog?author=5d025ce5e4376c0001389069) IN [Data Viz Challenge](http://www.storytellingwithdata.com/blog?category=Data+Viz+Challenge), [SWD Challenge](http://www.storytellingwithdata.com/blog?category=SWDchallenge)
- [Rstudio Community](https://community.rstudio.com/) - [Table Contest](https://community.rstudio.com/c/R-Markdown/tables/38) - an incredibly rich set of examples
- New package [reactable](https://glin.github.io/reactable/) - see the examples for what's possible
- Kable
- Anybody else?