用于统计分析和报告撰写的工作stream程

有没有人有任何关于自定义报告写作相关的数据分析的工作stream程的智慧? 用例基本上是这样的:

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

  2. 分析人员下载一些数据,调用数据并保存结果(例如,为每个单位的人口数量添加一列,或者根据地区边界对数据进行子集)。

  3. 分析师分析(2)中创build的数据,接近她的目标,但是看到需要更多数据,因此回到(1)。

  4. 冲洗重复,直到表和graphics符合质量保证/质量控制,并满足客户。

  5. 写报告合并表和graphics。

  6. 明年,快乐的客户回来,想要更新。 这应该与通过新下载更新上游数据一样简单(例如获得去年的build筑许可证),并按下“RECALCULATE”button,除非规范发生变化。

目前,我只是开始一个目录,并尽我所能特设。 我想要一个更系统化的方法,所以我希望有人解决这个问题……我使用了电子表格,SQL,ARCGIS,R和Unix工具的组合。

谢谢!

PS:

下面是一个基本的Makefile,它检查各种中间数据集(w / .RData后缀)和脚本( .R后缀)的依赖关系。 Make使用时间戳来检查依赖关系,所以如果你touch ss07por.csv ,它会看到这个文件比依赖它的所有文件/目标更新,并执行给定的脚本以便相应地更新它们。 这仍然是一个正在进行的工作,其中包括一个步入SQL数据库的步骤,还有一个像sweave这样的模板语言的步骤。 请注意,Make在语法上依赖于选项卡,因此请在剪切和粘贴之前阅读该手册。 享受并提供反馈!

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

 R = /家庭/ wsprague / R-2.9.2 /斌/ 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

我通常把我的项目分成四部分:

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

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

干净.R:这是所有丑陋的东西生活的地方 – 照顾缺失的价值,合并数据框架,处理exception值。

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

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

这种设置的主要动机是处理大量数据,从而不必在每次对后续步骤进行更改时都不得不重新加载数据。 此外,保持我的代码这样分割这意味着我可以回到一个长期被遗忘的项目,并快速阅读load.R和计算出我需要更新什么数据,然后看看do.R来确定执行了什么分析。

如果您希望看到一些示例,我可以在线获得一些小的(不是很小的)数据清理和分析项目。 在大多数情况下,你会发现一个脚本来下载数据,一个来清理它,还有一些做的是探索和分析:

  • 婴儿从社会保障pipe理局的名字
  • 来自EPI的30多年的燃料经济数据
  • 关于住房危机的大量数据
  • 来自IMDB的电影评级
  • 在湾区的房屋销售数据

最近我已经开始编写脚本了,所以它们应该以什么顺序运行是非常明显的。 (如果我真的很喜欢,我有时会这样做,以便探索脚本将调用清理脚本,然后调用下载脚本,每个脚本都需要最less的工作 – 通常通过检查输出文件的存在但是,大多数时候这似乎是矫枉过正)。

我将git用于我的所有项目(源代码pipe理系统),因此可以轻松地与其他人协作,查看正在发生的变化并轻松回滚到以前的版本。

如果我做了一个正式的报告,我通常保持R和乳胶分离,但我总是确保我可以获得我的R代码来生成所需的报告代码和输出。 对于我所做的报告,我发现这比使用乳胶更简单,更清洁。

我同意其他响应者:Sweave非常适合用R编写报表。重新生成更新结果报告与重新调用Sweave函数一样简单。 它是完全独立的,包括所有的分析,数据等,并且可以对整个文件进行版本控制。

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

我还要补充一点, 你可以用Beamer创build漂亮的报告 。 创build一个正常的报告是一样简单。 我在下面的例子中包含了从Yahoo! 并创build一个图表和一个表(使用quantmod)。 你可以像这样构build这个报告:

 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} 

我只是想补充,如果有人错过了,那么在学者博客上有一篇关于用Jeffrey Horner的brew包 创build重复性报告 的好消息 。 马特和凯文都提到上面的酿造。 我自己并没有真正使用它。

条目遵循一个不错的工作stream程,所以这是值得一读:

  1. 准备数据。
  2. 准备报告模板。
  3. 生成报告。

实际上,前两步完成后生成报告非常简单:

 library(tools) library(brew) brew("population.brew", "population.tex") texi2dvi("population.tex", pdf = TRUE) 

为了创build自定义报告,我发现结合这里提到的许多现有的技巧是很有用的。

生成报告:生成报告的好策略包括Sweave,make和R的组合。

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

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

代码组织:就代码组织而言,我发现两个有用的策略:

  • 阅读有关分析工作stream程(例如, ProjectTemplate ,Josh Reich的想法,我自己在R工作stream程幻灯片和video中的演示)
  • 研究示例报告和辨别工作stream程
    • 哈德利·韦克姆的例子
    • 我在github上的例子
    • 在交叉validation列出的可重复研究的例子

我使用Sweave进行报告制作,但是我也一直听说有关这个冲泡包 – 尽pipe我还没有看过它。

本质上,我有一些调查,我为其产生总结统计。 同样的调查,每次相同的报告。 我为报告build立了一个Sweave模板(需要一点工作)。 但是一旦工作完成,我有一个单独的R脚本,可以让我指出新的数据。 我按“Go”,Sweave转储出几个.tex文件,然后运行一个Python脚本来pdflatex它们。 我的前任每年在这些报告上花费大约6周的时间; 我花了大约3天(主要是清理数据;逃生字符是危险的)。

现在有更好的方法是很有可能的,但是如果你决定走这条路线,让我知道 – 我一直想要把我的一些Sweave的斧头,这是一个很好的踢裤子做所以。

我将根据您提出的具体关于项目工作stream程而不是工具的事实,向其他提交者指出不同的方向。 假设您对文档制作模型相对满意,听起来您的挑战确实可能更多地集中在版本跟踪,资产pipe理和审阅/发布过程的问题上。

如果这听起来是正确的,我会build议寻找像Redmine一样的综合票务/源代码pipe理/文档工具。 将相关的项目工件(如待处理任务,讨论线索和版本化的数据/代码文件)保存在一起,即使对于传统的“编程”职位以外的项目,也能起到很大的帮助作用。

同意Sweave是要走的路,用xtable生成LaTeX表。 尽pipe我没有花费太多时间与他们合作,但最近发布的tikzDevice包看起来非常有前途,特别是在加上pgfSweave (据我所知目前只在rforge.net上可用) – 有一个从那里链接到r-forge,但目前没有响应)。

在这两者之间,你会得到文本和数字(字体等)之间一致的格式。 随着酿造,这些可能会成为报告生成的圣杯。

在更“元”层面上,您可能对CRISP-DM过程模型感兴趣。

“make”非常棒,因为(1)你可以在任何语言中使用它(不像Sweave和Brew),(2)它非常强大(足以在你的机器上构build所有的软件), (3)避免重复工作。 最后一点对我来说很重要,因为很多工作都很慢。 当我为一个文件创build一个文件时,我喜欢在几秒钟内看到结果,而不是重新创build数字的时间。

为了写一个快速的初步报告或电子邮件给同事,我发现它可以非常有效的复制和粘贴到MS Word或电子邮件或维基页面 – 通常最好是一个位图的截图(例如苹果,苹果-Shift-(CTRL)-4)。 我认为这是一个被低估的技术。

为了得到更多的最终报告,编写R函数来轻松地重新生成所有图(作为文件)是非常重要的。 这需要更多的时间来编码。

在更大的工作stream程问题上,我喜欢Hadley的清单和分析stream程中枚举代码/数据文件的答案。 我所有的数据分析项目都有类似的结构。

我会join我的声音来发誓。 对于复杂的多步分析,您可以使用makefile来指定不同的部分。 如果只是一个部分已经改变,可以防止重复整个分析。

我也做Josh Reich所做的事情,只有我创build了我的个人R包,因为它帮助我构造我的代码和数据,而且与其他人分享也很容易。

  1. 创build我的包
  2. 加载
  3. 清洁
  4. function

创build我的包:devtools :: create('package_name')

加载和清理:我在我的包的data-raw /子文件夹中创build脚本,以便使用devtools :: use_data(object_name)加载,清理和存储生成的数据对象到包中。 然后我编译这个包。 从现在起,调用库(package_name)使这些数据可用(并且在必要时它们不被加载)。

函数:我把我的分析函数放到我的包的R /子文件夹中,只导出需要从外部调用的函数(而不是辅助函数,它们可以保持不可见)。

做:我创build一个脚本,使用存储在我的包中的数据和函数。 (如果分析只需要进行一次,我可以把这个脚本放到data-raw /子文件夹中,运行它,并将结果保存在包中,以便于访问。)

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

  • info :pdfs,powerpoints,docs …这些将不会被任何脚本使用
  • data input :将由我的脚本使用但不由它们生成的数据
  • data output :由我的脚本生成的数据,供进一步使用,但不作为正确的报告。
  • reports :只有实际显示给其他人的文件
  • R :所有R脚本
  • SAS :因为我有时必须:'(

我写了自定义函数,所以我可以调用smart_save(x,y)smart_load(x)来保存或加载data output文件夹(使用variables名命名的RDS files smart_load(x)中的RDS files ,所以在分析过程中我不会受到paths困扰。

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

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


 00_main.R 
  • setwd
  • 调用脚本1到5

 00_functions.R 
  • 所有的函数和函数都去了那里,如果有太多的我将它分成几个,所有的命名都像00_functions_something.R ,特别是如果我打算从其中的一些打包,我会把它们分开

 00_explore.R 
  • 一堆脚本块,我正在testing的东西或探索我的数据
  • 这是唯一允许我弄脏的文件。

 01_initialize.R 
  • 预先填充了一个从我的模板文件夹调用更通用的initialize_general.R脚本,该文件夹加载了我始终使用的包和数据,不介意在我的工作区中
  • 加载00_functions.R (预00_functions.R
  • 加载额外的库
  • 设置全局variables

 02_load data.R 
  • 加载csv/txt xlsx RDS ,每种types的文件都有一个预填充的注释行
  • 显示在工作区中创build了哪些文件

 03_pull data from DB.R 
  • 使用dbplyr从数据库中提取过滤和分组表
  • 一些预填充注释行来build立连接和获取。
  • 保持客户端操作最小化
  • 此脚本之外没有服务器端操作
  • 显示在工作区中创build了哪些文件
  • 保存这些variables,以便可以更快地重新加载它们

一旦完成,我关掉了一个query_db布尔值,数据将从RDS下次重新加载。

这可能会发生,我必须重新向DB数据,如果是的话,我会创build额外的步骤。


 04_Build.R 
  • 数据争吵,所有有趣的dplyr / tidyr东西去那里
  • 显示在工作区中创build了哪些文件
  • 保存这些variables

一旦我closures了build布尔值,并且数据将在下次从RDS重新加载。


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

 95_build ppt.R 
  • powerpoint报告使用officer模板

 96_prepare markdown.R 
  • setwd
  • 加载数据
  • 如果需要设置降价参数
  • render

 97_prepare shiny.R 
  • setwd
  • 加载数据
  • 如果需要设置shiny的参数
  • runApp

 98_Markdown report.Rmd 
  • 报告模板

 99_Shiny report.Rmd 
  • 应用程序模板