我正在写带有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列中列出了每个国家/地区的机场数量。
我有一个长的两列桌子,这很浪费空间。我想将此表拆分为两个子表,并将这些子表与包含两个子表的标题并排放置。
答案 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)
```
这给出了:
请注意,如果没有该零行矩阵,则这两个部分会更靠近在一起。要进一步增加间距,请将零行矩阵的多余副本放入 列表。
答案 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")
```