每个数据帧集群在pdf文件的单独页面上

时间:2015-08-03 07:20:26

标签: r

我将使用mtcars数据框作为示例。我想在pdf文件的每一页上打印两列数据框,具体取决于它们所属的集群。

                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3

我们假设列carb是群集列。如您所见,我们有4个不同的集群,所以我想要做的是将两列的输出(从第一个开始)放在pdf的单独页面上。

首页应如下所示:

  1. Datsun 710 22.8
  2. Hornet 4 Drive 21.4
  3. Valiant 18.1
  4. 第二页应如下所示:

    1. Hornet Sportabout 18.7
    2. Merc 240D 24.4
    3. Merc 230 22.8
    4. 第三页应如下所示:

      1. Merc 450SE 16.4
      2. 我相信你已经知道最后一页的输出应该是什么样的。你能帮帮我吗?我的数据框总共包含大约250个群集。

2 个答案:

答案 0 :(得分:3)

grid.newpage()强制每个表显示在新页面上,

pdf("multipage.pdf")
lapply(split(mtcars, mtcars$carb), function(d) {
  grid::grid.newpage()
  gridExtra::grid.table(d)
  }
  )
dev.off()

答案 1 :(得分:1)

除了@ baptiste的答案之外,还有一个使用rmarkdown的解决方案。要在新的pdf页面上打印每个表格,您必须设置results='asis'。使用cat("\n\n\\newpage")cat("\n\n\##"),您可以动态创建新的网页和标题。 knitr::kable()提供了一个很好的表输出。

---
title: "mtcars_clusters"
author: "Your name"
date: "3 August 2015"
output: pdf_document
---

```{r, echo=FALSE, results='asis'}
DAT <- lapply(sort(unique(mtcars$carb)), function(cluster) {
      data <- subset(mtcars, carb == cluster)
      cat(paste("\n\n## Cluster", cluster))
      print(knitr::kable(data))
      cat("\n\n\\newpage")
})
```

编辑:数据集较大的示例

关于你对@ baptiste的回答,这种降价方法也可以更好地处理更大的数据集。以下是使用ChickWeight作为群集变量的ChickWeight$Diet数据集的示例:

---
title: "ChickWeight_clusters"
author: "Your name"
date: "3 August 2015"
output: pdf_document
---

```{r, echo=FALSE, results='asis'}
DAT <- lapply(sort(unique(ChickWeight$Diet)), function(cluster) {
  data <- subset(ChickWeight, Diet == cluster)
  cat(paste("\n\n## Cluster", cluster))
  print(knitr::kable(data))
  cat("\n\n\\newpage")
})
```

输出表会自动在页面之间拆分,因此您应该看到所有行。此外,如果您只想在data内打印特定列,则只需print(knitr::kable(data))