合并由 kable 在 Rmarkdown 中创建的 latex table 中的列 header

Merging column header in latex table created by kable in Rmarkdown

我在 Rmarkdown 中使用 kable 创建了如下乳胶 table:

---
output: pdf_document
header-includes:
  - \usepackage{xcolor}
---

```{r, message=FALSE, warning=FALSE, echo=FALSE}
library(kableExtra)
library(tidyr)
library(dplyr)

data(iris)
iris %>% 
  as_tibble %>%
  gather(.,key = variable,value = value,-Species) %>%
  group_by(Species,variable) %>%
  summarise(value=mean(value)) %>%
  ungroup %>%
  spread(.,key = variable,value = value) %>%
  mutate(`Percentage Change`=`Petal.Length`/`Petal.Width`*100) %>%
        kable(.,format='latex',
        align='c',linesep='',
        booktabs=TRUE,escape=FALSE) %>%
  add_header_above(.,c(' '=1,'Parts'=4,' '=1),
                   escape = FALSE) %>%
  kable_styling(latex_options = c('striped','HOLD_position','scale_down'))
```

我想将 header 列“物种”和“百分比变化”分别与其上方的空白 space 合并,以便 Species 可以放在两header行的中间,而Percentage Change (Petal Length/ Petal Width)可以占据两行,而不是上面有一个空行,并防止其他列下面有一个空行。

想知道是否可以在kable中修改最好,也欢迎latex“hack”建议。

谢谢!

我认为这种乳胶 'hack' 解决方案更清洁。在 kable 中也可以这样做,但这需要更改数据框(将列名转换为行)以便可以使用 collapse_rows 。无论如何,这是乳胶的出路:

您在问题中提供的代码未提供 pdf 快照中的列名称。所以我首先编辑了代码以获得 table:

---
output: 
  pdf_document:
    keep_tex: true
header-includes:
  - \usepackage{xcolor}
---

```{r, message=FALSE, warning=FALSE, echo=FALSE}
library(kableExtra)
library(tidyr)
library(dplyr)

data(iris)
iris %>% 
  as_tibble %>%
  gather(.,key = variable,value = value,-Species) %>%
  group_by(Species,variable) %>%
  summarise(value=mean(value)) %>%
  ungroup %>%
  spread(.,key = variable,value = value) %>%
  mutate('Percentage Change\n(Petal length/ Petal width)'=`Petal.Length`/`Petal.Width`*100) %>%
  kable(format='latex',align='c',linesep='',booktabs=TRUE,escape=FALSE,
        col.names = linebreak(colnames(.),align = 'c')) %>%
  add_header_above(.,c(' '=1,'Parts'=4,' '=1),escape = FALSE) %>%
  collapse_rows(columns = c(1,6),valign = 'middle')%>%
  kable_styling(latex_options = c('striped','HOLD_position','scale_down'))
```

这给出了这个:

注意上面代码中的两点:

  1. keep_tex: true:这个保留了生成的.tex文件,可以用来编辑。
  2. 使用 linebreaks 确保最后一列的整个列名不在一行中。

现在我们对 Latex 输出做一些小改动。在下面的代码中,注释掉的行是 kable 生成的原始代码。如图所示,这将由注释掉的行下方的新行替换。

\begin{table}[H]
\centering
\resizebox{\linewidth}{!}{
\begin{tabular}{cccccc}
\toprule
% \multicolumn{1}{c}{ } & \multicolumn{4}{c}{Parts} & \multicolumn{1}{c}{ } \
\multirow{2}{*}{Species} & \multicolumn{4}{c}{Parts} & \multirow{2}{*}{\makecell[c]{Percentage Change\(Petal length/ Petal width)}} \ % replaced line
\cmidrule(l{3pt}r{3pt}){2-5}
% Species & Petal.Length & Petal.Width & Sepal.Length & Sepal.Width & \makecell[c]{Percentage Change\(Petal length/ Petal width)}\
& Petal.Length & Petal.Width & Sepal.Length & Sepal.Width &\ % replaced line
\midrule
\cellcolor{gray!6}{setosa} & \cellcolor{gray!6}{1.462} & \cellcolor{gray!6}{0.246} & \cellcolor{gray!6}{5.006} & \cellcolor{gray!6}{3.428} & \cellcolor{gray!6}{594.3089}\
\cmidrule{1-6}
versicolor & 4.260 & 1.326 & 5.936 & 2.770 & 321.2670\
\cmidrule{1-6}
\cellcolor{gray!6}{virginica} & \cellcolor{gray!6}{5.552} & \cellcolor{gray!6}{2.026} & \cellcolor{gray!6}{6.588} & \cellcolor{gray!6}{2.974} & \cellcolor{gray!6}{274.0375}\
\bottomrule
\end{tabular}}
\end{table}

这给出了以下输出: