Custom Formats in gt Tables
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
The “grammar of tables” is used to build tables with the R-package gt. Thomas Mock published an extension package called gtExtras which is used all over in tweets about NFL and Fantasy Football such as win and loss history information in a table.
gt
follows a similar philosophy such as ggplot2
. On the one hand there is the data
to be shown (in a table resp. a plot). On the other hand there is the description
how to visualize the data: What is the table header, are there subheaders, how
are the cells grouped and formated?
So it was time to check out gt
. During my tryouts I came across one demand
I haven’t found an in-built solution for: I wanted to format a column with respect
to the value of another column. Here’s the way I solved it:
Sample data
Let’s start with some sample data
1 2 3 4 5 6 7 8 9 |
options(tidyverse.quiet = TRUE) library(tidyverse) set.seed(42) data <- tibble( case = letters[1:5], value = rnorm(5, 5, 10), status = c("ok", "unknown", "ok", "not ok", "unknown") ) |
First gt-table
and create a simple gt
-table
1 2 3 4 |
library(gt) data %>% gt() |
case | value | status |
---|---|---|
a | 18.7095845 | ok |
b | -0.6469817 | unknown |
c | 8.6312841 | ok |
d | 11.3286260 | not ok |
e | 9.0426832 | unknown |
That’s great! That’s a pretty table with just one command!
Colored column based on its own values
Now let’s format the column value
depending on its value:
1 2 3 4 5 6 |
data %>% gt() %>% data_color( columns = value, colors = c("red", "orange", "yellow", "green") ) |
case | value | status |
---|---|---|
a | 18.7095845 | ok |
b | -0.6469817 | unknown |
c | 8.6312841 | ok |
d | 11.3286260 | not ok |
e | 9.0426832 | unknown |
Colored column based on value of another column
But now we want to format the column depending on the value
in column status
:
When status
is ok show a green background in column value
, in case of “not okay”
a red one, otherwise show a yellow background.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
custom_tab_style <- function(data, column, status_column) { condition_green = glue::glue("{status_column} == 'ok'") condition_red = glue::glue("{status_column} == 'not ok'") condition_yellow = glue::glue("{status_column} == 'unknown'") data %>% tab_style( style = cell_fill(color = 'lightgreen'), locations = cells_body( columns = all_of(column), rows = eval(parse(text = condition_green)) ) ) %>% tab_style( style = list(cell_fill(color = 'red'), cell_text(color = 'white')), locations = cells_body( columns = all_of(column), rows = eval(parse(text = condition_red)) ) ) %>% tab_style( style = cell_fill(color = 'yellow'), locations = cells_body( columns = all_of(column), rows = eval(parse(text = condition_yellow)) ) ) } data %>% gt() %>% custom_tab_style("value", "status") |
case | value | status |
---|---|---|
a | 18.7095845 | ok |
b | -0.6469817 | unknown |
c | 8.6312841 | ok |
d | 11.3286260 | not ok |
e | 9.0426832 | unknown |
As you can see I built a custom function custom_tab_style
.
Within this function I used the function tab_style
and a arbitrary conditions
to format the cells depending on the condition.
Hide the status column
Last we want to hide the column status
. We can achieve this by using
cols_hide()
1 2 3 4 |
data %>% gt() %>% custom_tab_style("value", "status") %>% cols_hide(columns = "status") |
case | value |
---|---|
a | 18.7095845 |
b | -0.6469817 |
c | 8.6312841 |
d | 11.3286260 |
e | 9.0426832 |
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.