在rmarkdown中包装宽表

时间:2019-03-17 14:49:28

标签: r latex r-markdown kable

我有一个非常宽的表(超过300列),并且希望通过包装这些列来显示它。在示例中,我将仅使用100列。

我要记住的是反复使用kable来显示表的子集:

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的答案似乎运行良好,但在此未产生相同的结果。取而代之的是我得到了一些简单的代码-请您再看看一下,让我知道我可以改进什么地方?谢谢!

results

我的sessionInfo()是:R version 3.5.1 (2018-07-02),其中rmarkdown::pandoc_version()1.19.2.1

2 个答案:

答案 0 :(得分:2)

这个问题实际上比我乍看时要棘手。我使用了一些tidyverse函数,特别是dplyr::select来获取列,而purrr::map则沿着列索引组移动。

我的想法是制作一个要选择的列索引向量列表,以使第一个列表项为1:20,第二个列表项为21:40,依此类推,以便打破将数据分成20个表,每个表5列(您使用的数字可以是ncol(data)的不同因子)。我低估了这样做的工作量,但是从an old SO post获得了一些想法,沿着列数重复数字1到20,对其进行排序,然后将其用作分组然后拆分列。

然后这些向量中的每一个成为select中的列索引。数据帧的结果列表每个都传递给knitr::kablekableExtra::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输出的顶部:

pdf

答案 1 :(得分:1)

您可以使用包含列号的矩阵,并将其放入带有ALTER table mytable ADD OldSellingPrice int; UPDATE t SET t.OldSellingPrice = CASE WHEN NOT EXISTS(SELECT 1 FROM mytable t1 WHERE t.ParentPnxCode = t1.ParentPnxCode AND t1.LineNum < t.LineNum) THEN CASE ParentPnxCode WHEN 'X' THEN 1735 WHEN 'Y' THEN 3000 END ELSE 0 END FROM mytable t 函数的for循环中。

cat

结果

enter image description here

相关问题