如何拆分表格,使其在R markdown中并排显示?

时间:2019-06-04 13:40:38

标签: r-markdown

我正在写带有R减价的文档,我想放一张桌子。问题在于该表只有两列,并占据了整页,这不是很漂亮。所以我的问题是:是否有办法将此表一分为二,并以两个标题并排放置两个“子表”?

我使用kable命令,并尝试了此解决方案(How to split kable over multiple columns?),但无法执行cbind()命令。

这是我创建表的代码:

---
title: 
author: 
date: "`r format(Sys.time(), '%d %B, %Y')`"
output: pdf_document
indent: true
header-includes:
  - \usepackage{indentfirst}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```{r, echo = FALSE}
kable(aerop2, format = "markdown")

其中aerop2是我的数据框,在第1列中列出了国家名称,在第2列中列出了每个国家/地区的机场数量。

我有一个长的两列桌子,这很浪费空间。我想将此表拆分为两个子表,并将这些子表与包含两个子表的标题并排放置。

2 个答案:

答案 0 :(得分:1)

这不会给间距带来很大的灵活性,但这是一种实现方法。我以mtcars数据集为例,因为我没有aerop2

---
output: pdf_document
indent: true
header-includes:
  - \usepackage{indentfirst}
  - \usepackage{booktabs}
---

```{r setup, include=FALSE}
library(knitr)
opts_chunk$set(echo = TRUE)
```

The data are in Table \ref{tab:tables}, which will float to the top of the page.

```{r echo = FALSE}
rows <- seq_len(nrow(mtcars) %/% 2)
kable(list(mtcars[rows,1:2],  
           matrix(numeric(), nrow=0, ncol=1),
           mtcars[-rows, 1:2]), 
      caption = "This is the caption.",
      label = "tables", format = "latex", booktabs = TRUE) 
```

这给出了:

screenshot

请注意,如果没有该零行矩阵,则这两个部分会更靠近在一起。要进一步增加间距,请将零行矩阵的多余副本放入 列表。

答案 1 :(得分:1)

'user2554330'提供的解决方案非常有用。
当我需要拆分为更多的列,并最终拆分为更多的部分时,我进一步提出了这个想法。 我还需要在文本后面有表格,而不是浮到顶部。我找到了使用kableExtra::kable_styling(latex_options = "hold_position")的方法。 我在这里写信是为了分享发展动态并提出一些小问题。
1-为什么添加行 - \usepackage{indentfirst}
2-label = "tables"作为kable()输入有什么作用?
(这些问题与Latex有关。我可能很少了解kable()文档中的解释:“标签-表引用标签”!)

---
title: "Test-split.print"
header-includes:
  - \usepackage{booktabs}
output:
  pdf_document: default
  html_document:
    df_print: paged
---

```{r setup, include=FALSE}
suppressPackageStartupMessages(library(tidyverse))
library(knitr)
library(kableExtra)

split.print <- function(x, cols = 2, sects = 1, spaces = 1, caption = "", label = ""){
  if (cols < 1) stop("cols must be GT 1!")
  if (sects < 1) stop("sects must be GT 1!")
  rims <- nrow(x) %% sects
  nris <- (rep(nrow(x) %/% sects, sects) + c(rep(1, rims), rep(0, sects-rims))) %>%
    cumsum() %>% 
    c(0, .)
  
  for(s in 1:sects){
    xs <- x[(nris[s]+1):nris[s+1], ]
    rimc <- nrow(xs) %% cols
    nric <- (rep(nrow(xs) %/% cols, cols) + c(rep(1, rimc), rep(0, cols-rimc))) %>%
      cumsum() %>% 
      c(0, .)
    lst <- NULL
    spc <- NULL
    for(sp in 1:spaces) spc <- c(spc, list(matrix(numeric(), nrow=0, ncol=1)))
    for(c in 1:cols){
      lst <- c(lst, list(xs[(nric[c]+1):nric[c+1], ]))
      if (cols > 1 & c < cols) lst <- c(lst, spc)
    }
    kable(lst, 
          caption = ifelse(sects == 1, caption, paste0(caption, " (", s, "/", sects, ")")),
          label = "tables", format = "latex", booktabs = TRUE) %>% 
      kable_styling(latex_options = "hold_position") %>% 
      print()
  }
}
```

```{r, results='asis'}
airquality %>% 
  select(1:3) %>% 
  split.print(cols = 3, sects = 2, caption = "multi page table")
```