合并由 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'))
```
这给出了这个:
注意上面代码中的两点:
keep_tex: true
:这个保留了生成的.tex文件,可以用来编辑。
- 使用
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}
这给出了以下输出:
我在 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'))
```
这给出了这个:
注意上面代码中的两点:
keep_tex: true
:这个保留了生成的.tex文件,可以用来编辑。- 使用
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}
这给出了以下输出: