Intro
When I was recently writing some report using R Markdown
, I wanted to place two rather small tables side by side. Since I usually use the kable()
-function of the knitr
package and the kableExtra
package to print tables, I tried to find a solution for my problem using both packages.
Since my Google search (“two tables side by side with kableExtra” or something similar) did not return a helpful result, I experimented with some table formating options provided by the kableExtra
package. Here is my solution.
Packages and data
For printing the tables we need to install and load two packages: knitr
and kableExtra
. The dplyr
packages is required for some data manipulation. The data we want to put into the tables stem from the bundesligR
package which contains final tables of Germany's highest football (soccer) league. We want to place the final tables of two seasons (1985/86 and 2015/16) side by side.
df <- bundesligR::bundesligR table.1985 <- df %>% filter(Season == 1985) %>% select(Position, Team, Points) table.2015 <- df %>% filter(Season == 2015) %>% select(Position, Team, Points)
Now, we place both tables side by side using some functionality of the kableExtra
package:
table.1985 %>% kable("html", align = 'clc', caption = 'Bundesliga, Season 1985/86') %>% kable_styling(full_width = F, position = "float_left") table.2015 %>% kable("html", align = 'clc', caption = 'Bundesliga, Season 2015/16') %>% kable_styling(full_width = F, position = "right")
Position | Team | Points |
---|---|---|
1 | FC Bayern Muenchen | 70 |
2 | Werder Bremen | 69 |
3 | FC Bayer 05 Uerdingen | 64 |
4 | Borussia Moenchengladbach | 57 |
5 | VfB Stuttgart | 58 |
6 | TSV Bayer 04 Leverkusen | 55 |
7 | Hamburger SV | 56 |
8 | SV Waldhof Mannheim | 44 |
9 | VfL Bochum | 46 |
10 | FC Schalke 04 | 41 |
11 | 1. FC Kaiserslautern | 40 |
12 | 1. FC Nuernberg | 41 |
13 | 1. FC Koeln | 38 |
14 | Fortuna Duesseldorf | 40 |
15 | Eintracht Frankfurt | 35 |
16 | Borussia Dortmund | 38 |
17 | 1. FC Saarbruecken | 27 |
18 | Hannover 96 | 23 |
Position | Team | Points |
---|---|---|
1 | FC Bayern Muenchen | 88 |
2 | Borussia Dortmund | 78 |
3 | Bayer 04 Leverkusen | 60 |
4 | Borussia Moenchengladbach | 55 |
5 | FC Schalke 04 | 52 |
6 | 1. FSV Mainz 05 | 50 |
7 | Hertha BSC | 50 |
8 | VfL Wolfsburg | 45 |
9 | 1. FC Koeln | 43 |
10 | Hamburger SV | 41 |
11 | FC Ingolstadt 04 | 40 |
12 | FC Augsburg | 38 |
13 | Werder Bremen | 38 |
14 | SV Darmstadt 98 | 38 |
15 | TSG 1899 Hoffenheim | 37 |
16 | Eintracht Frankfurt | 36 |
17 | VfB Stuttgart | 33 |
18 | Hannover 96 | 25 |
The trick is to set the position
argument to float_left
(left table) and right
(right table). Furthermore, the argument full_width
must be set to FALSE
in both tables.
To Do
Unfortunately, the given example only works for rendering HTML documents. Does anyone know how to place two tables side by side when the output format is PDF/LaTeX?
For a PDF/LaTex solution see the answer by Marcin Kosiński in https://stackoverflow.com/questions/23926671/side-by-side-xtables-in-rmarkdown
and see https://github.com/HanOostdijk/rmd_pdf_examples/blob/master/Iris_data_set_vm6.pdf were I used Marcin’s method
Thank you!