将多个表格并排对齐

37
以下代码会生成两个表格,如何设置使它们并排对齐,例如每行3个?
---
title: "sample"
output: pdf_document
---

```{r global_options, R.options=knitr::opts_chunk$set(warning=FALSE, message=FALSE)}
```   

```{r sample, echo=FALSE, results='asis'}
library(knitr)
t1 <- head(mtcars)[1:3]
t2 <- head(mtcars)[4:6]
print(kable(t1))
print(kable(t2))
```

输出结果如下所示:图片描述


http://tex.stackexchange.com/questions/2832/how-can-i-have-two-tables-side-by-side - RoyalTS
在研究如何实现这个过程时,我看到了这个。我不理解这个语法;排名最靠前的答案说:“只需将两个表格环境并排放置。根据需要添加间距。”然后展示了一些类似于 \begin{tabular}{ccc} 的语法代码。我不知道如何将其应用于上面的示例,使用 mtcars 表格? - Doug Fir
5个回答

48

只需将两个数据框放入一个列表中,例如:

t1 <- head(mtcars)[1:3]
t2 <- head(mtcars)[4:6]
knitr::kable(list(t1, t2))

请注意,这需要 knitr 版本不低于 1.13。


11
可以,你是否有同样简单的方法在表格之间添加间距? - Doug Fir
2
@JeanV.Adams 不,Word不被支持。 - Yihui Xie
17
可以调整两张表格之间的间距吗? - Dambo
3
有趣的是,当将表格分配给对象并作为列表传递给单个kable()调用并在pdf文档中呈现时,与将表格作为块的最后一条命令结果打印出来的情况不同,渲染的默认格式不同。从列表呈现的表格具有完全轮廓的单元格,而未分配的表格在正文部分具有部分开放的单元格。 - DaveRGP
4
尽管knitr::kable(list(t1, t2)) %>% kable_styling()没有出现错误,但其结果就像整个表格被制作成了单行一样。 :-( - Paulo S. Abreu
显示剩余8条评论

30

我使用了这个Align two data.frames next to each other with knitr? 来展示如何在html中实现,以及这个https://tex.stackexchange.com/questions/2832/how-can-i-have-two-tables-side-by-side来将两个LaTeX表格并排放置。似乎不能像xtable一样自由调整表格的行(有人知道更多关于这个吗?)。使用format = Latex会在每行之后得到一条水平线的表格。但是文档显示了两个其他格式的示例。一个使用 longtable包(附加参数:longtable = TRUE),另一个使用booktabs包(booktabs = TRUE)。

---
title: "sample"
output: pdf_document
header-includes:
- \usepackage{booktabs}
---

```{r global_options, R.options=knitr::opts_chunk$set(warning=FALSE, message=FALSE)}
```


```{r sample, echo=FALSE, results='asis'}
library(knitr)
library(xtable)

t1 <- kable(head(mtcars)[1:3], format = "latex", booktabs = TRUE)
t2 <- kable(head(mtcars)[4:6], format = "latex", booktabs = TRUE)

cat(c("\\begin{table}[!htb]
    \\begin{minipage}{.5\\linewidth}
      \\caption{}
      \\centering",
        t1,
    "\\end{minipage}%
    \\begin{minipage}{.5\\linewidth}
      \\centering
        \\caption{}",
        t2,
    "\\end{minipage} 
\\end{table}"
))  
```

在这里输入图像描述


4
不,那是LaTeX。如果您使用rmarkdown并且要生成PDF,则无法直接使用。它首先会被翻译成LaTeX。有趣的是,您还可以直接使用 LaTeX 并发挥其全部功能。 - Alex
1
这是有用的代码,我已经成功创建了三行表格。谢谢!您如何在表格和标题之间添加空格?如果合适,我很乐意将其作为一个新问题提出。 - user2716568
2
@user2716568 简单来说,如果你想要减少1厘米的空间,请在\\end{minipage}% \\begin{minipage}之间(在%后面)加入\\hspace{-1cm}。我通常会为我认为有帮助或有趣的问题或答案投票。然而,在Stack Overflow上似乎这并不常见...。 - Alex
1
@Moody_Mudskipper,应该有类似的解决方案。但是为此我会发起一个新问题。 - Alex
1
我认为@Alex正在使用一种有效地从R块文本返回的方法,然后由LaTeX处理。这意味着如果您要编写以下内联内容:\begin{table}[!htb] \begin{minipage}{.5\linewidth} \caption{} \centering, \r t1`, \end{minipage}% \begin{minipage}{.5\linewidth} \centering \caption{}, `r t2`, \end{minipage} \end{table}几乎是功能等效的,除了在表格之前和之后打印出t1t2`周围的反引号。有什么办法解决这个问题吗? - DaveRGP
显示剩余3条评论

27

这里提供了一个针对HTML文档的解决方案。

(由于这个问题被非常宽泛地提出,而不是具体地指涉LaTeX)。

需要使用knitrkableExtra

---
title: "Side by side"
output: html_document
---


```{r sample, echo=FALSE}
library(knitr)
library(kableExtra)
t1 <- head(mtcars)[1:3]
t2 <- head(mtcars)[4:6]
```
## as list
```{r}
kable(list(t1, t2))
```

## with float
```{r, echo = FALSE}
kable(t1) %>%
  kable_styling(full_width = FALSE, position = "float_left")
kable(t2) %>%
  kable_styling(full_width = FALSE, position = "left")
```

让表格t2的position = "left"是有意为之的。如果您允许它浮动,这将不会阻塞段落的其余部分,并会弄乱文档中后续行的排列。

结果:

enter image description here


1
在像您所做的那样并排显示表格时,有没有办法单独控制每个表格的宽度? - daniellga
1
@daniellga 没有尝试过,但请查看此答案:https://dev59.com/-lgR5IYBdhLWcg3wAJBK#61538273 - 如果有用,请考虑点赞,谢谢 :)(这不是我的!) - tjebo
1
这对于HTML或PDF文档都适用,对吗? - W7GVR
这个解决方案不起作用:列表选项不接受像col.names这样的选项用于kable。而且float选项不能将表格并排放置,它们仍然在下面。我猜这是由于页面的最大宽度限制,但是我在这个选项上找不到最大宽度的选项。 - undefined

9
Quarto中,您可以使用layout-ncol。这适用于HTML和PDF输出。
---
title: "sidebyside"
format: pdf
---

```{r}
#| layout-ncol: 2
#| tbl-cap: "Tables"
#| tbl-subcap: ["A table", "Another table"]

library(knitr)

# table on the left
kable(head(mtcars))

# table on the right
kable(head(cars))
```

enter image description here


1
我在处理带有KableExtra对象的Quarto子标题时遇到了问题。奇怪的是,添加类似于#| label: tbl-example的标签解决了这个问题。 - Matthew Son

1
借用@Alex的回答,因为我没有足够的声望来留下评论。
---
title: "sample"
output: pdf_document
header-includes:
- \usepackage{booktabs}
---

```{r}
library(knitr)
library(xtable)

t1 <- kable(head(mtcars)[1:3], format = "latex", booktabs = TRUE)
t2 <- kable(head(mtcars)[4:6], format = "latex", booktabs = TRUE)
```

\begin{table}[!htb]
  \begin{minipage}{.5\linewidth}
    \centering
```{r}
t1
```
\end{minipage}%
  \begin{minipage}{.5\linewidth}
    \centering
```{r}
t2
```
\end{minipage}%
\end{table}

这将代替cat()函数调用。根据我的经验,从代码块输出LaTeX代码只会导致它以纯文本形式打印在PDF中。

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