如何在R markdown中使表格并排显示?

9
我正在使用R markdown编写一份文档,想要插入一个表格。但问题在于这个表格只有两列,却需要占用整个页面,显得不太美观。所以我的问题是:是否有办法将这个表格分成两个子表格,并将它们放在一起,只有一个标题?
我使用了kable命令,并尝试了这个解决方案(如何将kable分成多列?),但我无法执行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是我数据框中第一列包含国家名称,第二列包含每个国家机场数量的列表。

我有一个很长的两列表格,占用了很多空间。我想将这个表格分成两个子表格,并将这些子表格并排放置,并包含它们两个的标题。


这个问题 https://dev59.com/kVoT5IYBdhLWcg3w6iy3 询问如何将两个表并排放置。分割您的表应该是可能的,只需选择行,例如 rows <- 1:(nrow(aerop2) %/% 2); part1 <- aerop2[rows,]; part2 <- aerop2[-rows,] - user2554330
问题在于它创建了两个单独的表和两个标题,有没有办法只有一个标题涵盖这两个表呢? - bretauv
你需要查找“子表”。这是一个LaTeX问题。请参考https://tex.stackexchange.com/questions/294589/alignment-and-placing-of-subtables作为示例。 - user2554330
2个回答

18

这种方法在间距方面没有太大的灵活性,但以下是一种实现方式。我使用 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请注意,如果没有那个全零行矩阵,这两部分会更加接近。为了增加间距,可以在列表中添加额外的全零行矩阵的副本。

这对于我来说在一个非常长的表格中没有起作用。 - bob
@bob:你应该发布一个新问题,并包含一个可重现的示例,展示出了什么问题。在你的问题中引用这个问题,这样你的问题就不会被删除为重复问题。 - user2554330

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

这是一个很好的答案,因为我们可以确定列数。回答你的问题:1)这行代码在这里没有用处,我猜我把它放在这里是因为当时在我的个人代码中,我忘记删除它了;2)这是为了在文本中进行引用(如果你删除它,在文本中会得到“??”而不是表格的编号)。 - bretauv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接