【问题标题】:Merging column header in latex table created by kable in Rmarkdown合并 Rmarkdown 中 kable 创建的乳胶表中的列标题
【发布时间】:2021-02-21 03:45:16
【问题描述】:

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

---
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'))
```

我想让列标题“物种”和“百分比变化”分别与它们上方的空白区域合并,这样Species可以放在两个标题行的中间,而Percentage Change (Petal Length/ Petal Width)可以占用两行,而不是上面有一个空行,并防止其他列下面有一个空行。

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

谢谢!

【问题讨论】:

    标签: r-markdown kable kableextra


    【解决方案1】:

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

    您在问题中提供的代码未提供 pdf 快照中的列名称。所以我先编辑了代码来得到那个表:

    ---
    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}
    

    这给出了以下输出:

    【讨论】:

    • 谢谢!这是可行的,但在一种情况下,column_spec 在通过 kable 创建表时无法使用,column_spec 似乎阻止使用代码makecell,是否可以在使用column_spec 时给出相同的结果?再次感谢!
    • 您能否详细说明您使用column_spec 的目的是什么?
    • makecell 只是将最后一列的列名分成两行。有其他方法可以处理这个问题。
    • 感谢Dayne的回复,下周一我会提出一个案例
    • 嘿 Dayne,column_spec 似乎已修复,也许这只是我之前尝试使用 column_spec 并结合您的解决方案时的错误,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多