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

时间:2016-07-25 15:46:37

标签: r 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都没有不同。

1 个答案:

答案 0 :(得分:8)

看起来 parameterized report 可能就是您所需要的。有关详细信息,请参阅该链接,但基本思路是在yaml报告的rmarkdown中设置参数,并在报告中使用该参数对其进行自定义(例如,通过过滤数据)在你的情况下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)获取名称。