如何使用 R markdown 为数据框的每个子集创建不同的报告?

How to create a different report for each subset of a data frame with R markdown?

我有一个看起来像

的数据集
 City   Score   Count   Returns
 Dallas 2.9 61  21
 Phoenix    2.6 52  14
 Milwaukee  1.7 38  7
 Chicago    1.2 95  16
 Phoenix    5.9 96  16
 Dallas 1.9 45  12
 Dallas 2.7 75  45
 Chicago    2.2 75  10
 Milwaukee  2.6 12  2
 Milwaukee  4.5 32  0
 Dallas 1.9 65  12
 Chicago    4.9 95  13
 Chicago    5   45  5
 Phoenix    5.2 43  5

我想使用 R markdown 构建报告;但是,我需要为每个城市建立一个报告。原因是一个城市看不到另一个城市的报告。如何为每个城市构建报告并保存为 PDF 文件?

每份报告都需要中位数 Score、平均值 Count 和平均值 Returns。我知道使用 dplyr 我可以简单地使用

finaldat <- dat %>%
            group_by(City) %>%
            summarise(Score = median(Score),
                      Count = mean(Count)  ,
                      Return= mean(Returns))

但挫败感来自为每个 City 生成报告。此外,这是数据的子集,而不是完整数据。也就是这个报告是广泛的,是结果的报告,是系统的,没有因人而异City

看起来 parameterized report 可能是您需要的。有关详细信息,请参阅 link,但基本思想是在 rmarkdown 报告的 yaml 中设置一个参数,并在报告中使用该参数对其进行自定义(例如,通过在您的情况下按 City 过滤数据)。然后在一个单独的 R 脚本中,您多次 render 报告,每个 City 的值一次,您将其作为参数传递给 render 函数。这是一个基本示例:

在您的 Rmarkdown 报告中,您将在 yaml 中声明参数。如果在呈现报表时没有输入其他值,则列出的值 Dallas 在这种情况下只是默认值:

---
title: My Document
output: pdf_document
params:
   My_City: Dallas
---

然后,在同一个 Rmarkdown 文档中,您将拥有整个报告——无论计算取决于 City,加上任何 City 都相同的样板。您可以使用 params$My_City 访问参数。下面的代码会将数据框过滤为 My_City 参数的当前值:

```{r}
dat %>%        
    filter(City==params$My_City) %>%
    summarise(Score = median(Score),
              Count = mean(Count)  ,
              Return= mean(Returns))
```

然后,在一个单独的 R 脚本中,您将执行类似以下的操作来为每个 City 生成单独的报告(我假设上面的 Rmarkdown 文件名为 MyReport.Rmd) :

for (i in unique(dat$City)) {
    rmarkdown::render("MyReport.Rmd", 
                      params = list(My_City = i),
                      output_file=paste0(i, ".pdf"))
}

在上面的代码中,我假设 dat 数据框位于呈现 MyReport.Rmd 的单独 R 脚本的全局环境中。但是,您也可以只提供城市名称向量,而不是从 unique(dat$City).

获取名称

要使用动态标题(请参阅评论中的问题):

您可以在标题中使用参数(以及其他 YAML 元数据,例如作者)。例如:

rmd 文件

---
title: "Data for `r params$city`"
output: pdf_document
params:
  city: Dallas
---

Body of report

单独的 R 脚本来呈现 rmd 文件

编译两个城市的rmd文件:

for (i in c("New York", "Los Angeles")) {
  rmarkdown::render("test1.Rmd", 
                    params = list(city = i),
                    output_file=paste0(i, ".pdf"))
}

有关更多信息,请参阅 R Markdown Cookbook