Load needed packages
pacman::p_load(tidyverse,kableExtra,toolkit)
Basic Tips
For Latex PDF
- PIN table in the exact position:
kable_styling(latex_options = "hold_position") uses [!h]
kable_styling(latex_options = "HOLD_position") uses [H] and the float package.
For Html
- Fixed Table Header Row:
kable_styling(fixed_head = T)
Use print_kable function
dat<-mtcars[1:10, 1:4]
dat%>%print_kable(rowname_label = 'car', num_col = 2)
| car |
mpg |
cyl |
disp |
hp |
| Mazda RX4 |
21.0 |
6 |
160 |
110 |
| Mazda RX4 Wag |
21.0 |
6 |
160 |
110 |
| Datsun 710 |
22.8 |
4 |
108 |
93 |
| Hornet 4 Drive |
21.4 |
6 |
258 |
110 |
| Hornet Sportabout |
18.7 |
8 |
360 |
175 |
|
| car |
mpg |
cyl |
disp |
hp |
| Valiant |
18.1 |
6 |
225.0 |
105 |
| Duster 360 |
14.3 |
8 |
360.0 |
245 |
| Merc 240D |
24.4 |
4 |
146.7 |
62 |
| Merc 230 |
22.8 |
4 |
140.8 |
95 |
| Merc 280 |
19.2 |
6 |
167.6 |
123 |
|
Column/Row Specification
mtcars[1:8, 1:8] %>%
print_kable()%>%
column_spec(2, color = spec_color(mtcars$mpg[1:8])) %>%
column_spec(6, color = "white",background = spec_color(mtcars$drat[1:8], end = 0.7))%>%
row_spec(0, color='white',background = 'green')%>%
row_spec(3:5, bold = T)
| mpg |
cyl |
disp |
hp |
drat |
wt |
qsec |
vs |
| 21.0 |
6 |
160.0 |
110 |
3.90 |
2.62 |
16.46 |
0 |
| 21.0 |
6 |
160.0 |
110 |
3.90 |
2.88 |
17.02 |
0 |
| 22.8 |
4 |
108.0 |
93 |
3.85 |
2.32 |
18.61 |
1 |
| 21.4 |
6 |
258.0 |
110 |
3.08 |
3.21 |
19.44 |
1 |
| 18.7 |
8 |
360.0 |
175 |
3.15 |
3.44 |
17.02 |
0 |
| 18.1 |
6 |
225.0 |
105 |
2.76 |
3.46 |
20.22 |
1 |
| 14.3 |
8 |
360.0 |
245 |
3.21 |
3.57 |
15.84 |
0 |
| 24.4 |
4 |
146.7 |
62 |
3.69 |
3.19 |
20.00 |
1 |
Cell Specification
cell_spec generates raw HTML or LaTeX code, make sure you remember to put escape = FALSE in kable.
- At the same time, you have to escape special symbols including
% manually by yourself
cell_spec needs a way to know whether you want html or latex. You can specify it via the options(knitr.table.format = doc.type)
dat%>%
mutate(mpg=cell_spec(mpg, color = ifelse(mpg > 20, "red", "blue")))%>%
print_kable(escape=FALSE)
| mpg |
cyl |
disp |
hp |
| 21 |
6 |
160.0 |
110 |
| 21 |
6 |
160.0 |
110 |
| 22.8 |
4 |
108.0 |
93 |
| 21.4 |
6 |
258.0 |
110 |
| 18.7 |
8 |
360.0 |
175 |
| 18.1 |
6 |
225.0 |
105 |
| 14.3 |
8 |
360.0 |
245 |
| 24.4 |
4 |
146.7 |
62 |
| 22.8 |
4 |
140.8 |
95 |
| 19.2 |
6 |
167.6 |
123 |
Add header rows to group columns
mtcars[1:5,1:6]%>%
print_kable(rowname_label = 'car')%>%
add_header_above(c(" " = 1, "Group 1" = 2, "Group 2" = 2, "Group 3" = 2))
|
Group 1 |
Group 2 |
Group 3 |
| car |
mpg |
cyl |
disp |
hp |
drat |
wt |
| Mazda RX4 |
21.0 |
6 |
160 |
110 |
3.90 |
2.62 |
| Mazda RX4 Wag |
21.0 |
6 |
160 |
110 |
3.90 |
2.88 |
| Datsun 710 |
22.8 |
4 |
108 |
93 |
3.85 |
2.32 |
| Hornet 4 Drive |
21.4 |
6 |
258 |
110 |
3.08 |
3.21 |
| Hornet Sportabout |
18.7 |
8 |
360 |
175 |
3.15 |
3.44 |
Group rows via labeling
mtcars[1:5, 1:6] %>%
print_kable()%>%
pack_rows("Group 1", 1, 2) %>%
pack_rows("Group 2", 3, 5)
| mpg |
cyl |
disp |
hp |
drat |
wt |
| Group 1 |
| 21.0 |
6 |
160 |
110 |
3.90 |
2.62 |
| 21.0 |
6 |
160 |
110 |
3.90 |
2.88 |
| Group 2 |
| 22.8 |
4 |
108 |
93 |
3.85 |
2.32 |
| 21.4 |
6 |
258 |
110 |
3.08 |
3.21 |
| 18.7 |
8 |
360 |
175 |
3.15 |
3.44 |
Group rows via multi-row cell
dt <- data.frame(C1=rep(LETTERS[1:2],each=4),C2=rep(LETTERS[c(3:4,3:4)],each=2), C3 = 1:8)
dt%>%
print_kable()%>%
collapse_rows(columns = 1:2, valign = "middle")
| C1 |
C2 |
C3 |
| A |
C |
1 |
| 2 |
| D |
3 |
| 4 |
| B |
C |
5 |
| 6 |
| D |
7 |
| 8 |