统计分析和报告撰写的工作流程

189

有没有人对于与自定义报告编写相关的数据分析工作流程有什么建议?使用案例基本上是这样的:

  1. 客户委托编写使用数据分析的报告,例如一个水区域的人口估计和相关地图。

  2. 分析师下载一些数据,处理数据并保存结果(例如添加每个单位的人口列,或根据区域边界对数据进行子集化)。

  3. 分析师分析在(2)中创建的数据,接近目标,但发现需要更多数据,因此返回(1)。

  4. 反复操作,直到表格和图形符合QA / QC并满足客户要求。

  5. 编写报告并包含表格和图形。

  6. 明年,客户会回来想要更新。这应该是通过新下载的上游数据更新(例如从去年取得建筑许可),然后按下"RECALCULATE"按钮就可以了,除非规格发生变化。

目前,我只是创建一个目录,并尽力处理它。我希望能够更加系统化地处理,所以我希望有人已经搞定了这个问题... 我使用电子表格、SQL、ARCGIS、R和Unix工具的组合。

谢谢!

PS:

以下是一个基本的Makefile,检查各种中间数据集(带.RData后缀)和脚本(.R后缀)的依赖关系。Make使用时间戳来检查依赖关系,因此如果您touch ss07por.csv,它将看到该文件比所有依赖于它的文件/目标都要新,并按顺序执行给定的脚本来更新它们。这仍然是一个正在进行的工作,包括将其放入SQL数据库的步骤,以及使用sweave之类的模板语言的步骤。请注意,Make依赖于其语法中的制表符,因此在剪切和粘贴之前请阅读手册。享受并提供反馈!

http://www.gnu.org/software/make/manual/html_node/index.html#Top

R=/home/wsprague/R-2.9.2/bin/R

persondata.RData : ImportData.R ../../DATA/ss07por.csv Functions.R
   $R --slave -f ImportData.R

persondata.Munged.RData : MungeData.R persondata.RData Functions.R
      $R --slave -f MungeData.R
report.txt: TabulateAndGraph.R persondata.Munged.RData Functions.R $R --slave -f TabulateAndGraph.R > report.txt

14
哦,天啊。凡是进来的人,请小心: 这个问题的答案在五年前是很好的。但现在,全部都已经过时了。现在有更好的工具可供使用。作为一个起点,我会推荐一个使用Makefile和Knitr的示例项目。请勿遵循此处任何答案的建议。 - Konrad Rudolph
R Notebooksodbc driversgitgit lfs对于这个问题都是不可多得的工具。 - DaveRGP
2
我强烈建议按照这里(https://github.com/ropensci/rrrpkg)概述的原则设置项目。所谓的“研究手册”在进行可重复数据科学时是救星。 - Kresten
14个回答

200

我通常将我的项目分为4个部分:

  1. load.R
  2. clean.R
  3. func.R
  4. do.R

load.R:负责加载所有所需的数据。通常这是一个短文件,从文件、URL和/或ODBC中读取数据。根据项目,此时我要么使用save()写出工作空间,要么只在内存中保存数据以进行下一步。

clean.R:这里是所有丑陋的代码 - 处理缺失值、合并数据帧、处理异常值等。

func.R:包含执行实际分析所需的所有功能。source()该文件不应具有除加载函数定义之外的任何副作用。这意味着您可以修改此文件并重新加载它,而无需返回并重复步骤1和2,对于大型数据集,这可能需要很长时间才能运行。

do.R:调用在func.R中定义的函数,执行分析并生成图表和表格。

这种设置的主要动机是处理大型数据时,您不想每次更改后续步骤时都重新加载数据。此外,像这样将我的代码分隔开来意味着我可以回到一个被遗忘已久的项目,快速阅读load.R并确定需要更新哪些数据,然后查看do.R以了解执行了哪些分析。


12
这是一个非常好的工作流程。我一直在苦苦思索如何设计工作流程,但当我询问周围的人时,他们通常会回答,“什么?工作流程?哎呀?”所以我认为他们并没有太多考虑这个问题。我将采用莱因(Riechian) 的 LCFD 模型。 - JD Long
1
这与我的工作流程非常接近,我经常有导入脚本、分析脚本和报告脚本。 - kpierce8
4
LCFD: 最不常出错的数据。 - William Doane
2
这里有一段由Jeromy Anglim制作的漂亮的演示视频+幻灯片,展示了这个工作流程。链接为http://www.vcasmo.com/video/drewconway/10362。 - David LeBauer
2
@Simone 这是链接:http://files.meetup.com/1685538/Rmeetup_Workflow_fullscreen.pdf - David LeBauer
显示剩余6条评论

96

如果您想看一些示例,我有一些关于数据清洗和分析的小型(以及不那么小型)项目可在网上获取。在大多数情况下,您会发现一个脚本用于下载数据,一个脚本用于清理数据,并且还有一些用于探索和分析:

最近我开始对脚本进行编号,这样就完全明显了它们应该按什么顺序运行。(如果我感到非常高级,我有时会使探索脚本调用清理脚本,后者又调用下载脚本,每个脚本都尽可能地执行最小的工作 - 通常通过检查是否存在具有file.exists的输出文件。然而,大多数时候这似乎过度了)。

我使用git为所有项目进行源代码管理,因此易于与他人合作,查看更改内容并轻松回滚到先前版本。

如果我做正式报告,我通常会将R和latex分开,但我始终确保可以source我的R代码,以生成我需要的所有代码和输出。对于我所做的那种类型的报告,我发现这比使用latex更容易和更清洁。


我之前评论了关于Makefiles的事情,但你可能想要研究一下它们——这是传统的依赖检查语言。另外,我打算尝试学习ggplot2——看起来很棒! - forkandwait
我喜欢有一种指定文件之间依赖关系的方式,但是必须学习m4让我很不爽。我希望有类似于R中编写的raken这样的东西。 - hadley
2
对于依赖项,您也可以在R文件中完成。而不是执行source("blah.R"),首先检查所需的变量是否存在:if (!exists("foo")) { source("blah.R") }。这样可以避免重复运行依赖项,如果它们已经运行过了。 - naught101

17

我同意其他回答者:Sweave非常适合使用R进行报告写作。重新调用Sweave函数即可通过更新结果来重建报告。它是完全自包含的,包括所有分析、数据等内容。而且你可以对整个文件进行版本控制。

我使用Eclipse的StatET插件开发报告,并集成了Sweave(Eclipse可以识别latex格式等)。在Windows上,使用MikTEX很容易

我还想补充一点,你可以使用Beamer创建漂亮的报告。创建普通报告同样简单。下面提供了一个示例,从Yahoo!获取数据并创建图表和表格(使用quantmod)。你可以这样构建这个报告:

Sweave(file = "test.Rnw")

这是 Beamer 文档本身:

% 
\documentclass[compress]{beamer}
\usepackage{Sweave}
\usetheme{PaloAlto} 
\begin{document}

\title{test report}
\author{john doe}
\date{September 3, 2009} 

\maketitle

\begin{frame}[fragile]\frametitle{Page 1: chart}

<<echo=FALSE,fig=TRUE,height=4, width=7>>=
library(quantmod)
getSymbols("PFE", from="2009-06-01")
chartSeries(PFE)
@

\end{frame}


\begin{frame}[fragile]\frametitle{Page 2: table}

<<echo=FALSE,results=tex>>=
library(xtable)
xtable(PFE[1:10,1:4], caption = "PFE")
@

\end{frame}

\end{document}

6
在测试一个Sweave报告的可重复性之前,不要相信它是可重复的,因为很容易存在隐含的外部依赖关系。请在干净的机器上进行测试。 - John D. Cook

17
我只是想补充一下,如果有人错过了的话,learnr博客上有一篇很棒的文章,介绍如何使用Jeffrey Horner的brew包创建重复报告。Matt和Kevin都在上面提到了brew。我自己实际上没有用过它太多。
这些条目遵循一个不错的工作流程,因此值得一读:
  1. 准备数据。
  2. 准备报告模板。
  3. 生成报告。
一旦完成前两个步骤,实际上生成报告非常简单:
library(tools)
library(brew)
brew("population.brew", "population.tex")
texi2dvi("population.tex", pdf = TRUE)

在修正一个小语法错误时,我搞砸了wordpress.com的地址。因此正确的链接是http://learnr.wordpress.com/2009/09/09/brew-creating-repetitive-reports/。 - learnr

15

创建自定义报告时,我发现结合这里提供的许多有用提示非常实用。

生成报告: 生成报告的一个好策略是结合Sweave、make和R。

编辑器: 编写Sweave文档的好编辑器包括:

  • StatET和Eclipse
  • Emacs和ESS
  • Vim和Vim-R
  • R Studio

代码组织: 在代码组织方面,我发现两种策略很有用:


7
我在报告生成方面使用Sweave,但我也听说过brew包-尽管我还没有研究它。基本上,我有许多调查需要生成摘要统计信息。每次都是相同的调查和报告。我为报告构建了一个Sweave模板(需要一些工作)。但是一旦完成工作,我就有了一个单独的R脚本,可以让我指出新数据。我按“Go”按钮,Sweave会输出几个.tex文件,然后我运行一个小Python脚本将它们全部转换成pdf格式。我的前任每年要花费约6周时间来制作这些报告;而我只花了大约3天的时间(大部分时间用于清理数据;转义字符很危险)。现在可能有更好的方法,但如果您决定采用这种方法,请告诉我-我一直想发布一些我的Sweave技巧,这将是一个好的契机。

很想看到一些关于"Sweave hacks"的内容。这让我头疼! - Brandon Bertelsen

7
我将提出一些与其他提交者不同的建议,基于你特别询问了“项目工作流程”而非“工具”的事实。假设你对文档生产模型相对满意,那么听起来你面临的挑战可能更集中在版本跟踪、资产管理和审阅/发布流程等问题。
如果这听起来正确,我建议你考虑使用一个综合性的工单/源码管理/文档工具,例如Redmine。即使对于传统的“编程”领域之外的项目,将相关的项目文档,如待处理任务、讨论主题和版本化的数据/代码文件保存在一起也可以很有帮助。

5
Agreed that Sweave is the way to go, with xtable for generating LaTeX tables. Although I haven't spent too much time working with them, the recently released tikzDevice package looks really promising, particularly when coupled with pgfSweave (which, as far as I know is only available on rforge.net at this time -- there is a link to r-forge from there, but it's not responding for me at the moment).
Between the two, you'll get consistent formatting between text and figures (fonts, etc.). With brew, these might constitute the holy grail of report generation.

pgfSweave目前处于“开发困境”中,因为开发人员没有时间将新的tikzDevice加入其中。目前我们建议在普通Sweave文档中使用tikzDevice - 用户只需负责打开/关闭设备并\ include {}结果输出即可。 - Sharpie
@Sharpie:pgfSweave的开发状态有更新了吗?它看起来很棒,但似乎在我尝试的任何系统上都无法正常工作。 - Ari B. Friedman
@gsk3 另一位开发者一直在积极更新pgfSweave,并自我评论发布以来已经做了很多工作。请前往http://github.com/cameronbracken/pgfSweave跟踪开发进展。如果该软件包无法正常运行,请提供错误报告,以便我们进行修复。 - Sharpie
@Sharpie:太好了,谢谢。我已经把你的消息转发给我的朋友了,他在这方面比我做得更多。如果他不很快提交错误报告,那么我会准备一个。看起来这是一个很棒的软件包;感谢你的辛勤工作。 - Ari B. Friedman

4

我使用项目模板和R Studio,目前我的模板包含以下文件夹:

  • info :包含不会被脚本使用的pdf、powerpoints、docs等文件
  • data input :包含脚本所需但不由其生成的数据
  • data output :由脚本生成的数据,供进一步使用但不作为正式报告
  • reports :仅包含将实际展示给他人的文件
  • R :所有R脚本
  • SAS :因为有时必须使用SAS :(

我编写了自定义函数,以便调用smart_save(x,y)smart_load(x)RDS文件保存到/从data output文件夹中(文件名与变量名称相同),以便在分析过程中不必受到路径的干扰。

自定义函数new_project创建带编号的项目文件夹,复制所有模板文件,重命名RProj文件并编辑setwd调用,并将工作目录设置为新项目。

所有R脚本都位于R文件夹中,结构如下:


00_main.R
  • setwd:设置当前工作目录。
  • 调用脚本1到5。
00_functions.R
  • 所有功能都放在这里,如果太多了,我会将其分成几个部分,全部以00_functions_something.R的形式命名,特别是如果我计划将其中一些制作成包,我会将它们分开。
00_explore.R
  • 一堆脚本块,我在测试或探索我的数据
  • 这是唯一允许我搞乱的文件。

01_initialize.R
  • 预先设置了对模板文件夹中更一般的initialize_general.R脚本的调用,该脚本加载我始终使用并不介意在我的工作空间中存在的包和数据
  • 加载00_functions.R(预设)
  • 加载其他库
  • 设置全局变量
02_load data.R
  • 可以加载 csv/txtxlsxRDS 文件,每种文件类型都有预填的注释行。
  • 显示哪些文件已经在工作区创建。
03_pull data from DB.R
  • 使用dbplyr从数据库中获取经过筛选和分组的表格
  • 一些已填好注释的行来设置连接并获取数据
  • 尽量减少客户端操作
  • 除了这个脚本,不进行任何服务器端操作
  • 显示哪些文件已在工作空间中创建
  • 保存这些变量,以便可以更快地重新加载它们

完成一次后,我会关闭query_db布尔值,下次数据将从RDS重新加载。

有时需要重新向数据库提供数据,如果需要,我会创建额外的步骤。


04_Build.R
  • 数据整理,所有有趣的dplyr/tidyr内容都在那里
  • 显示已在工作区创建的文件
  • 保存这些变量

完成一次后,我关闭build布尔值,下一次数据将从RDS重新加载。


05_Analyse.R
  • 总结,建模...
  • 报告 excelcsv 文件

95_build ppt.R
  • 使用officer创建PowerPoint报告的模板

96_prepare markdown.R
  • setwd:设置当前工作目录。
  • 加载数据。
  • 如有需要,设置Markdown参数。
  • render:渲染输出Markdown文档。
97_prepare shiny.R
  • setwd:设置工作目录。
  • 加载数据。
  • 根据需要设置 shiny 参数。
  • runApp:运行应用程序。
98_Markdown report.Rmd
  • 一个报告模板

99_Shiny report.Rmd

一个应用程序模板。

4
"

make"非常棒,因为(1)你可以在任何语言中使用它来完成所有工作(不像Sweave和Brew),(2)它非常强大(足以构建您计算机上的所有软件),(3)它避免了重复工作。对我来说,最后一点很重要,因为很多工作都很慢;当我使用latex编写文件时,我希望能在几秒钟内看到结果,而不是花费一个小时重新创建图表。

"

+1 代表“制作”;但是我不认为“制作”与Sweave不兼容。相反,当我生成报告时,“制作”会调用Sweave(和其他内容)。 - Jeromy Anglim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接