在 rmarkdown 中包装 table
wrapping wide table in rmarkdown
我有一个非常宽的 table(300 多列),我想通过换行来显示它。在示例中,我将只使用 100 列。
我的想法是重复使用 kable 来显示 table:
的子集
library(kableExtra)
set.seed(1)
data = data.frame(matrix(rnorm(300, 10, 1), ncol = 100))
kable(data[, 1:5], 'latex', booktabs = T)
kable(data[, 6:10], 'latex', booktabs = T)
kable(data[, 11:15], 'latex', booktabs = T)
但这显然很乏味...我知道有缩小选项,但由于我有这么多列,这是不可能的。
我可以在 kable 中修改任何参数来实现它吗?
更新:
@jay.sf 的答案似乎运作良好,但在这里没有产生相同的结果。相反,我得到了一些简单的代码——你能再看一眼,让我知道我在哪里可以改进吗?谢谢!
我的 sessionInfo()
是:R version 3.5.1 (2018-07-02)
和 1.19.2.1
的 rmarkdown::pandoc_version()
。
您可以使用包含列号的矩阵,并将其放入带有 cat
函数的 for 循环中。
---
output: pdf_document
---
```{r, results="asis", echo=FALSE}
library(kableExtra)
set.seed(1)
dat <- data.frame(matrix(rnorm(300, 10, 1), ncol=100))
m <- matrix(1:ncol(dat), 5)
for (i in 1:ncol(m)) {
cat(kable(dat[, m[, i]], 'latex', booktabs=TRUE), "\newline")
}
```
结果
这个问题其实比我乍一看想的要棘手。我使用了一些 tidyverse
函数,特别是 dplyr::select
来获取列和 purrr::map
来沿着列索引组移动。
我的想法是制作一个列索引向量列表供选择,这样第一个列表项是 1:20
,第二个是 21:40
,依此类推将数据分成 20 个表格,每个表格 5 列(您使用的数字可以是 ncol(data)
的不同因子)。我低估了这样做的工作量,但从 an old SO post 那里得到了一些想法,即沿着列数表示数字 1 到 20,对其进行排序,然后将其用作分组,然后拆分列。
然后这些向量中的每一个都成为 select
中的列索引。生成的数据帧列表分别传递给 knitr::kable
和 kableExtra::kable_styling
。把东西放在那里也会得到 map
的默认打印名称,这并不理想,所以我添加了对 purrr::walk
的调用以整齐地打印它们。
另请注意,以这种方式制作 kable
表意味着将 results="asis"
放入块选项中。
---
title: "knitr chunked"
output: pdf_document
---
```{r include=FALSE}
library(knitr)
library(kableExtra)
library(dplyr)
library(purrr)
set.seed(1)
data = data.frame(matrix(rnorm(300, 10, 1), ncol = 100))
```
```{r results='asis'}
split(1:ncol(data), sort(rep_len(1:20, ncol(data)))) %>%
map(~select(data, .)) %>%
map(kable, booktabs = T) %>%
map(kable_styling) %>%
walk(print)
```
PDF 输出的顶部:
我有一个非常宽的 table(300 多列),我想通过换行来显示它。在示例中,我将只使用 100 列。
我的想法是重复使用 kable 来显示 table:
的子集library(kableExtra)
set.seed(1)
data = data.frame(matrix(rnorm(300, 10, 1), ncol = 100))
kable(data[, 1:5], 'latex', booktabs = T)
kable(data[, 6:10], 'latex', booktabs = T)
kable(data[, 11:15], 'latex', booktabs = T)
但这显然很乏味...我知道有缩小选项,但由于我有这么多列,这是不可能的。
我可以在 kable 中修改任何参数来实现它吗?
更新: @jay.sf 的答案似乎运作良好,但在这里没有产生相同的结果。相反,我得到了一些简单的代码——你能再看一眼,让我知道我在哪里可以改进吗?谢谢!
我的 sessionInfo()
是:R version 3.5.1 (2018-07-02)
和 1.19.2.1
的 rmarkdown::pandoc_version()
。
您可以使用包含列号的矩阵,并将其放入带有 cat
函数的 for 循环中。
---
output: pdf_document
---
```{r, results="asis", echo=FALSE}
library(kableExtra)
set.seed(1)
dat <- data.frame(matrix(rnorm(300, 10, 1), ncol=100))
m <- matrix(1:ncol(dat), 5)
for (i in 1:ncol(m)) {
cat(kable(dat[, m[, i]], 'latex', booktabs=TRUE), "\newline")
}
```
结果
这个问题其实比我乍一看想的要棘手。我使用了一些 tidyverse
函数,特别是 dplyr::select
来获取列和 purrr::map
来沿着列索引组移动。
我的想法是制作一个列索引向量列表供选择,这样第一个列表项是 1:20
,第二个是 21:40
,依此类推将数据分成 20 个表格,每个表格 5 列(您使用的数字可以是 ncol(data)
的不同因子)。我低估了这样做的工作量,但从 an old SO post 那里得到了一些想法,即沿着列数表示数字 1 到 20,对其进行排序,然后将其用作分组,然后拆分列。
然后这些向量中的每一个都成为 select
中的列索引。生成的数据帧列表分别传递给 knitr::kable
和 kableExtra::kable_styling
。把东西放在那里也会得到 map
的默认打印名称,这并不理想,所以我添加了对 purrr::walk
的调用以整齐地打印它们。
另请注意,以这种方式制作 kable
表意味着将 results="asis"
放入块选项中。
---
title: "knitr chunked"
output: pdf_document
---
```{r include=FALSE}
library(knitr)
library(kableExtra)
library(dplyr)
library(purrr)
set.seed(1)
data = data.frame(matrix(rnorm(300, 10, 1), ncol = 100))
```
```{r results='asis'}
split(1:ncol(data), sort(rep_len(1:20, ncol(data)))) %>%
map(~select(data, .)) %>%
map(kable, booktabs = T) %>%
map(kable_styling) %>%
walk(print)
```
PDF 输出的顶部: