【问题标题】:How to create a different report for each subset of a data frame with R markdown?如何使用 R markdown 为数据框的每个子集创建不同的报告?
【发布时间】:2016-11-29 01:25:25
【问题描述】:

我有一个看起来像这样的数据集

 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没有不同。

【问题讨论】:

    标签: r r-markdown


    【解决方案1】:

    看起来 parameterized report 可能是您需要的。有关详细信息,请参阅链接,但基本思想是您在 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) 获取名称。

    使用动态标题(参见 cmets 中的问题):

    您可以在标题(以及其他 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

    【讨论】:

    • 所以你必须从 R 降价中分离一个脚本来循环遍历?创建一个函数来执行此操作会更有效吗?
    • 第一个问题是肯定的 (AFAIK)。我不知道如何在 Rmarkdown 文档中做到这一点。至于您的第二个问题,如果您要定期执行此操作,那么创建一个函数来执行此操作可能是有意义的。特别是如果您希望轻松自定义或概括报告。
    • 我仍然不清楚为什么我需要在我的Rmarkdown 中指定My_City: Dallas?当我使用for 循环时它会改变吗?
    • 是的,因为params = list(My_City = i) 将每个City 传递到render 函数中,每次循环都会更改该参数。我想您可以在 Rmarkdown 文档中将 My_City: 留空,看看它是否会引发错误。
    • 查看我的答案的更新。您可以在报告标题和/或其他 YAML 元数据中使用参数。
    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 2023-03-19
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多