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


185

是否有人对与自定义​​报告编写相关的数据分析工作流有任何智慧?用例基本上是这样的:

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

  2. 分析人员下载一些数据,对数据进行删节并保存结果(例如,为每单位人口增加一列,或根据地区边界对数据进行分组)。

  3. 分析人员分析了在(2)中创建的数据,接近了她的目标,但是发现需要更多数据,因此回到(1)。

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

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

  6. 明年,满意的客户会回来并要求更新。这应该很简单,例如通过新的下载来更新上游数据(例如,从去年获得建筑许可),然后按“重新计算”按钮,除非规格更改。

目前,我只是启动一个目录,并尽其所能对其进行临时设置。我想要一个更系统的方法,所以我希望有人能解决这个问题……我使用了电子表格,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-从-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


10
天啊。那些进入这里的人要当心:五年前这个问题的答案非常好。他们现在完全过时了。如今,我强烈建议您不要遵循此处的任何答案。现在有更好的工具可用。首先,我将参考使用Makefiles和Knitr的示例项目
康拉德·鲁道夫

R Notebooksodbc drivergitgit lfs都是解决这个问题的天堂。
DaveRGP '18年

我强烈建议您根据此处概述的原则设置项目(github.com/ropensci/rrrpkg)。进行可重复数据科学时,所谓的“研究纲要”是天赐之物
Kresten '19

Answers:


195

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

  1. 负载
  2. 清洁
  3. 功能

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

clean.R:这是所有丑陋事物的住所-照顾缺失值,合并数据框,处理异常值。

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

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

进行此设置的主要动机是使用大数据,因此您不需要每次对后续步骤进行更改时都不必重新加载数据。同样,这样使我的代码分隔开,意味着我可以回到一个长期被遗忘的项目并快速读取load.R并确定需要更新的数据,然后查看do.R来确定执行了哪些分析。


12
那是一个非常好的工作流程。我一直在努力设计工作流程,当我问周围的人时,他们通常会回答:“什么?工作流程?是吧?” 所以我认为他们不会考虑太多。我将采用Reichian LCFD模型。
JD Long

1
这非常接近我的工作流程,我经常有一个导入脚本,分析脚本和报告脚本
kpierce8

4
LCFD:最不常用的数据
William Doane

2
这里有一个不错的演示视频+ Jeromy Anglim的幻灯片,其中包含此工作流程vcasmo.com/video/drewconway/10362
David LeBauer 2010年


94

如果您想看一些示例,我可以在线上找到一些小(但不是那么小)的数据清理和分析项目。在大多数情况下,您会找到一个脚本来下载数据,一个脚本来清理数据,还有一些脚本来进行探索和分析:

最近,我开始为脚本编号,因此完全可以按照它们应运行的顺序进行编码。(如果我真的很喜欢,有时我会这样做,以便探索脚本将调用清理脚本,然后依次调用下载脚本,每个脚本都执行最小的工作-通常通过使用来检查输出文件的存在file.exists。但是,在大多数情况下,这似乎过于矫kill过正。

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

如果我做一份正式报告,通常我会将R和乳胶分开,但是我始终确保我可以使用sourceR代码来生成报告所需的所有代码和输出。对于我所做的各种报告,我发现这比使用乳胶更容易,更干净。


我在上面评论了Makefile,但您可能需要研究一下-这是传统的依赖项检查语言。另外-我将尝试学习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可以识别乳胶格式等)。在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

16

我只是想补充一下,以防万一有人错过它,在学习者博客上有一篇很棒的文章,关于Jeffrey Horner的酿造包创建重复报告。马特和凯文都在上面提到了酿造。我自己实际上并没有使用太多。

这些条目遵循一个不错的工作流程,因此非常值得一读:

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

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

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

在解决一个小的语法错误时,我弄乱了wordpress.com的地址。所以正确的链接是 learner.wordpress.com/2009/09/09/…–
学习者

14

对于创建自定义报告,我发现合并此处建议的许多现有技巧很有用。

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

编辑器: 准备Sweave文档的优秀编辑器包括:

  • StatET和Eclipse
  • Emacs和ESS
  • Vim和Vim-R
  • R工作室

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


7

我将Sweave用作报告的生成方,但我也一直在听说Brew包装-尽管我尚未对其进行研究。

从本质上讲,我有一些调查,可以为这些调查提供摘要统计信息。相同的调查,每次相同的报告。我为报告构建了一个Sweave模板(需要一些工作)。但是一旦工作完成,我将拥有一个单独的R脚本,该脚本可以让我指出新数据。我按“ Go”,Sweave转储了一些分数.tex文件,然后运行了一些Python脚本以将所有pdflatex。我的前任每年在这些报告上花费大约6周的时间;我花了大约3天的时间(大部分时间用于清洁数据;转义符很危险)。

现在很有可能有更好的方法,但是如果您决定走这条路,请告诉我-我一直打算放下一些Sweave hacks,这将是一条很好的选择所以。


希望看到其中一些“编织技巧”。这让我头疼!
布兰登·贝特尔森

7

基于您专门询问项目工作流程而非工具的事实,我将提出与其他提交者不同方向的建议。假设您对文档制作模型相对满意,听起来您的挑战实际上可能更多地集中在版本跟踪,资产管理和审阅/发布过程上。

如果听起来正确,我建议您考虑使用像Redmine这样的集成票务/源管理/文档工具。将相关的项目工件(例如待处理的任务,讨论线程和版本化的数据/代码文件)保持在一起,即使对于不在传统的“编程”百力域之外的项目也可以提供很大的帮助。


5

同意Sweave是必经之路,使用xtable生成LaTeX表。尽管我没有花太多时间与他们合作,但最近发布的tikzDevice软件包看起来确实很有希望,尤其是与pgfSweave结合使用(据我所知,该软件包目前仅在rforge.net上可用-有一个从那里链接到r-forge,但此刻目前我没有响应)。

在这两者之间,您将获得文本和图形(字体等)之间一致的格式。对于brew来说,这些可能构成报告生成的圣杯。


pgfSweave目前处于“开发困境”,因为开发人员还没有时间合并新的tikzDevice。现在,我们建议从普通的Sweave文档中使用tikzDevice -用户只需要负责打开/关闭设备并\ include {}结果输出。
Sharpie

@Sharpie:pgfSweave的开发状态有任何更新吗?看起来不错,但似乎无法在我尝试过的任何系统上运行。
Ari B. Friedman

@ gsk3自从我发表评论以来,其他开发人员一直非常积极地保持pgfSweave的更新,并做了很多工作。转到github.com/cameronbracken/pgfSweave跟踪开发。如果该软件包对您不起作用,我们希望获得一个错误报告,以便我们对其进行修复。
Sharpie

@夏皮:太好了,谢谢。我将您的信息转发给了我的朋友,他为此付出了更多的努力。如果他不立即提交错误报告,那么我将汇总。看起来很不错。感谢所有的辛勤工作。
Ari B. Friedman


4

“ make”之所以出色,是因为(1)您可以用任何语言将其用于所有工作(不同于Sweave和Brew),(2)它非常强大(足以在您的计算机上构建所有软件),并且(3)避免重复工作。最后一点对我很重要,因为很多工作都很缓慢;当我为文件添加乳胶时,我希望在几秒钟内看到结果,而不是重新生成图形所花费的时间。


+1制作;但是,我认为make与Sweave不兼容。而是当我生成报告时,进行呼叫Sweave(和其他操作)。
Jeromy Anglim

3

我将项目模板与R Studio一起使用,当前我的模板包含以下文件夹:

  • info :pdf,powerpoints,docs ...,任何脚本都不会使用
  • data input :将由我的脚本使用但不会由它们生成的数据
  • data output :由我的脚本生成的数据可供进一步使用,但不能作为适当的报告。
  • reports :仅实际显示给其他人的文件
  • R :所有R脚本
  • SAS :因为有时我必须:'(

我编写了自定义函数,因此可以在文件夹(以变量名命名的文件)中调用smart_save(x,y)smart_load(x)保存或RDS filesdata output文件夹中加载或加载,以便paths在分析过程中不会被打扰。

定制功能new_project创建一个编号项目文件夹,从模板复制所有文件,重命名RProj文件并编辑setwd调用,并将工作目录设置为新项目。

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


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

00_functions.R
  • 所有函数和唯一函数都去了那里,如果太多,我将其分成几个,全部命名为like 00_functions_something.R,特别是如果我打算从其中一些制作一个程序包,则将它们分开

00_explore.R
  • 一堆脚本块,我在其中进行测试或浏览数据
  • 这是我被允许凌乱的唯一文件。

01_initialize.R
  • 预填充了initialize_general.R我的模板文件夹中对更通用脚本的调用,该脚本可加载我一直使用且不介意在我的工作区中使用的包和数据
  • 装载00_functions.R(预装)
  • 加载其他库
  • 设置全局变量

02_load data.R
  • loading csv/txt xlsx RDS,每种类型的文件都有一个预填充的注释行
  • 显示在工作空间中创建了哪些文件

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
  • Powerpoint报告模板使用 officer

96_prepare markdown.R
  • setwd
  • 加载数据
  • 根据需要设置markdown参数
  • render

97_prepare shiny.R
  • setwd
  • 加载数据
  • 根据需要设置闪亮的参数
  • runApp

98_Markdown report.Rmd
  • 报告模板

99_Shiny report.Rmd
  • 应用模板

2

对于写给同事的快速初步报告或电子邮件,我发现将图复制并粘贴到MS Word或电子邮件或Wiki页面中非常有效-通常最好是位图截图(例如在Mac,Apple上) -Shift-(Ctrl)-4)。我认为这是一种被低估的技术。

对于更最终的报告,编写R函数以轻松地重新生成所有图(作为文件)非常重要。确实需要花费更多时间来编写代码。

对于较大的工作流问题,我喜欢Hadley关于枚举清洗和分析流程的代码/数据文件的答案。我所有的数据分析项目都具有类似的结构。


2

我将添加声音以进行弯曲。对于复杂的多步骤分析,您可以使用makefile来指定不同的部分。如果只更改了一部分,则可以避免重复整个分析。


0

我也做Josh Reich所做的事情,只是创建个人R包,因为它可以帮助我构建代码和数据,并且与他人共享它们也很容易。

  1. 创建我的包裹
  2. 加载
  3. 清洁
  4. 功能

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

加载和清理:我在软件包的data-raw /子文件夹中创建脚本,以使用devtools :: use_data(object_name)在软件包中加载,清理和存储结果数据对象。然后我编译该包。从现在开始,调用library(package_name)使这些数据可用(并且直到必要时才加载它们)。

函数:我将用于分析的函数放入程序包的R /子文件夹中,仅导出需要从外部调用的那些函数(而不导出那些可以保持不可见的辅助函数)。

要做:我创建一个脚本,该脚本使用存储在程序包中的数据和函数。(如果分析只需要进行一次,我也可以将此脚本放入data-raw /子文件夹中,运行它,并将结果存储在包中,以使其易于访问。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.