упаковка широкого стола в rmarkdown - PullRequest
1 голос
/ 17 марта 2019

У меня очень широкая таблица (более 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

my sessionInfo(): R version 3.5.1 (2018-07-02) с rmarkdown::pandoc_version() из 1.19.2.1.

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Этот вопрос на самом деле сложнее, чем я думал на первый взгляд.Я использовал некоторые tidyverse функции, в частности dplyr::select для получения столбцов и purrr::map для перемещения по группам индексов столбцов.

Я думал об этом, чтобы составить список векторов индексов столбцов на выбор,так, что первый элемент списка равен 1:20, второй - 21:40 и т. д., чтобы разбить данные на 20 таблиц по 5 столбцов в каждой (число, которое вы используете, может отличаться от ncol(data)),Я недооценил работу, чтобы сделать это, но получил идеи от старого сообщения SO , чтобы повторять числа от 1 до 20 по количеству столбцов, сортировать их и использовать в качестве группировки, а затем разделять столбцы.

Тогда каждый из этих векторов становится индексом столбца в select.Полученный список фреймов данных каждый передается в knitr::kable и kableExtra::kable_styling.Если оставить все как есть, то map будет по умолчанию также печатать имена, что не идеально, поэтому я добавил вызов purrr::walk, чтобы аккуратно их напечатать.

Обратите внимание, что создание *Таким образом, таблицы 1020 * d означали установку 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 голос
/ 17 марта 2019

Вы можете использовать матрицу, содержащую номера ваших столбцов, и поместить ее в цикл for с функцией cat внутри.

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

Результат

enter image description here

...