【问题标题】:Each cluster of data frame on separate page of pdf filepdf文件单独页面上的每个数据框簇
【发布时间】:2015-10-25 05:17:47
【问题描述】:

我将以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. 达特桑 710 22.8
  2. 大黄蜂 4 Drive 21.4
  3. 英勇18.1

第二页应该是这样的:

  1. Hornet Sportabout 18.7
  2. Merc 240D 24.4
  3. Merc 230 22.8

第三页应该是这样的:

  1. Merc 450SE 16.4

而且我相信您已经知道最后一页的输出应该是什么样子了。你能帮我吗?我的数据框总共包含大约 250 个集群。

【问题讨论】:

  • 我认为您可以使用lst <- split(mtcars[1], mtcars$carb) 将数据集与子集列拆分,您可以将列表输出保存为pdf
  • 同时检查here
  • 听起来不错。您能写一个答案并告诉我如何将 list 的输出保存为 pdf 吗?我想奖励你的解决方案。看起来不错。
  • 我尝试了pdf('somefile.pdf');lapply(lst, grid.table),但它在单个页面中被覆盖。我还没有尝试过链接中的解决方案。如果您可以对其进行测试并使其正常工作,您可以将其作为解决方案发布。

标签: r


【解决方案1】:

grid.newpage() 强制每个表格出现在新页面上,

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

【讨论】:

  • 这正是我想要的。它将整个表格作为输出,但我可以接受。您知道如何更改 pdf 文件中的字体大小或如何缩小表格,因为我没有看到所有行。
【解决方案2】:

除了@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$Diet 作为集群变量的ChickWeight 数据集示例:

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

输出表会自动在页面之间拆分,因此您应该可以看到所有行。此外,如果您只想打印特定列,只需在 print(knitr::kable(data)) 中相应地设置 data 的子集即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2011-11-17
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2019-11-18
    相关资源
    最近更新 更多