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

aka*_*h87 5 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
Run Code Online (Sandbox Code Playgroud)

我想用R markdown建立一份报告; 但是,对于每个城市,我需要建立一份报告.原因是一个城市无法看到另一个城市的报告.如何为每个城市构建报告并保存PDF?

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

finaldat <- dat %>%
            group_by(City) %>%
            summarise(Score = median(Score),
                      Count = mean(Count)  ,
                      Return= mean(Returns))
Run Code Online (Sandbox Code Playgroud)

但令人沮丧的是为每个人制作一份报告City.此外,这是数据的子集,而不是完整数据.也就是说,这份报告非常广泛,是一份结果报告,系统性,各自不同City.

eip*_*i10 8

看起来参数化报告可能就是您所需要的.看到该链接的详细信息,但基本的想法是,你在设置的参数yaml您的rmarkdown报告,并(通过例如,通过过滤数据使用该参数在报告中对其进行自定义City你的情况).然后在一个单独的R脚本中,render多次为报表,每个值一次,City作为参数传递给render函数.这是一个基本的例子:

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

---
title: My Document
output: pdf_document
params:
   My_City: Dallas
---
Run Code Online (Sandbox Code Playgroud)

然后,在同一个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))
```
Run Code Online (Sandbox Code Playgroud)

然后,在一个单独的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"))
}
Run Code Online (Sandbox Code Playgroud)

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