如何使用 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。
我有一个看起来像
的数据集 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。