我尝试复制下表。来自 gt
的这个
example正是我所需要的,但我只在 HTML 中工作,而不是 PDF。)
我使用
add_header_above
中的 kableExtra
的方法(也欢迎任何其他包):
我最大的问题是要考虑第 2 列和第 3 列的
header_above
,同时还要将第 1 列和第 4 列放在一个标题中,而无需使用 cline(valign:中间)。我还希望这两个标题 (1&4) 垂直居中对齐,并在第 4 列之间有一个换行符。
MWE 使用四开
---
title: "Example Table"
format:
pdf:
pdf-engine: xelatex
mainfont: "Barlow"
include-in-header:
text: |
\setlength{\arrayrulewidth}{0.35mm}
\renewcommand{\arraystretch}{1.8}
\arrayrulecolor{white}
---
```{r}
library(kableExtra)
df <- data.frame(
age = 1:3,
table1 = 1:3 / 10,
table2 = 1:3 / 100
)
df$diff <- df$table1 - df$table2
colhd <- "#548235"
colbd <- "#FFF2CC"
kable(df, format = "latex",
col.names = c("Age", "Table 1", "Table 2",
"Difference between Table 1 and Table 2")) |>
add_header_above(header = c(" " = 1, "Table Number" = 2, " " = 1),
background = colhd, color = "white") |>
row_spec(0, background = colhd, color = "white") |>
row_spec(1:3, background = colbd, color = "black") |>
column_spec(1, background = colhd, color = "white")
```
也许您想看看
flextable
?我发现这个包非常通用且简单。
我已经采用了您的示例并生成了您正在寻找的表格。除了您可能想要适应和选择的字体之外,一切都在那里。您可以直接复制粘贴运行并查看结果。
library(dplyr)
df <- data.frame(
age = 1:3,
table1 = 1:3 / 10,
table2 = 1:3 / 100
)
df$diff <- df$table1 - df$table2
names(df) <- c("Age", "Table 1", "Table 2", " ")
colhd <- "#548235"
colbd <- "#FFF2CC"
std_border <- officer::fp_border(color = "white")
df_flex <- df %>%
flextable() %>%
flextable::bg(bg = colbd, part = "body") %>%
flextable::add_header_row(
values = c(
"", "Table Number", "",
"Difference between\n table1 and table2"
)
) %>%
flextable::bg(bg = colhd, part = "header") %>%
flextable::color(color = "white", part = "header") %>%
flextable::align(align = "center", part = "header") %>%
flextable::merge_at(i = 1, j = c(2, 3), part = "header") %>%
flextable::merge_at(i = c(1, 2), j = 4, part = "header") %>%
flextable::bg(j = 1, bg = colhd, part = "body") %>%
flextable::color(j = 1, color = "white", part = "body") %>%
flextable::width(width = c(1, 1, 1, 2)) %>%
flextable::border(border = std_border, part = "all")
df_flex