189

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

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

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

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

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

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

  6. 明年,快乐的客户回来并想要更新。这应该像通过新下载更新上游数据一样简单(例如,从去年获得建筑许可),然后按“重新计算”按钮,除非规格发生变化。

目前,我只是启动一个目录,并尽我所能将其临时化。我想要一种更系统的方法,所以我希望有人能解决这个问题……我混合使用了电子表格、SQL、ARCGIS、R 和 Unix 工具。

谢谢!

PS:

.RData下面是一个基本的 Makefile,它检查各种中间数据集(带后缀)和脚本(后缀)的依赖关系.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

4

14 回答 14

199

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

  1. 负荷.R
  2. 干净的
  3. 函数R
  4. 做R

load.R:负责加载所需的所有数据。通常这是一个短文件,从文件、URL 和/或 ODBC 中读取数据。根据此时的项目,我将使用save()或仅将内容保存在内存中以供下一步使用。

clean.R:这是所有丑陋事物的所在——处理缺失值、合并数据框、处理异常值。

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

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

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

于 2009-09-16T17:34:34.097 回答
97

如果你想看一些例子,我有一些小型(而且不是那么小)的在线数据清理和分析项目。在大多数情况下,您会找到一个用于下载数据的脚本,一个用于清理数据的脚本,以及一些用于探索和分析的脚本:

最近我开始给脚本编号,所以它们应该按什么顺序运行是完全清楚的。(如果我真的很喜欢,我有时会这样做,以便探索脚本会调用清理脚本,而清理脚本又会调用下载脚本,每个都做必要的最少工作 - 通常通过检查是否存在带有file.exists.然而,大多数时候这似乎有点矫枉过正)。

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

如果我做一份正式报告,我通常将 R 和 Latex 分开,但我始终确保source我的 R 代码能够生成报告所需的所有代码和输出。对于我所做的各种报告,我发现这比使用乳胶更容易和更清洁。

于 2009-09-16T02:09:41.647 回答
17

I agree with the other responders: Sweave is excellent for report writing with R. And rebuilding the report with updated results is as simple as re-calling the Sweave function. It's completely self-contained, including all the analysis, data, etc. And you can version control the whole file.

I use the StatET plugin for Eclipse for developing the reports, and Sweave is integrated (Eclipse recognizes latex formating, etc). On Windows, it's easy to use MikTEX.

I would also add, that you can create beautiful reports with Beamer. Creating a normal report is just as simple. I included an example below that pulls data from Yahoo! and creates a chart and a table (using quantmod). You can build this report like so:

Sweave(file = "test.Rnw")

Here's the Beamer document itself:

% 
\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}
于 2009-09-15T23:56:33.960 回答
17

我只是想补充一下,以防有人错过,学习者博客上有一篇很棒的帖子,内容是使用Jeffrey Horner 的 brew 包创建重复报告。Matt 和 Kevin 在上面都提到了 brew。我自己并没有真正使用它。

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

  1. 准备数据。
  2. 准备报告模板。
  3. 制作报告。

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

library(tools)
library(brew)
brew("population.brew", "population.tex")
texi2dvi("population.tex", pdf = TRUE)
于 2009-09-17T05:15:31.137 回答
15

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

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

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

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

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

于 2010-12-29T06:40:43.767 回答
7

I'm going to suggest something in a different sort of direction from the other submitters, based on the fact that you asked specifically about project workflow, rather than tools. Assuming you're relatively happy with your document-production model, it sounds like your challenges really may be centered more around issues of version tracking, asset management, and review/publishing process.

If that sounds correct, I would suggest looking into an integrated ticketing/source management/documentation tool like Redmine. Keeping related project artifacts such as pending tasks, discussion threads, and versioned data/code files together can be a great help even for projects well outside the traditional "programming" bailiwick.

于 2009-09-15T23:40:17.937 回答
7

我使用Sweave来生成报告,但我也听说过brew包——尽管我还没有研究过。

从本质上讲,我有一些调查,我会为这些调查生成汇总统计数据。每次进行相同的调查,相同的报告。我为报告构建了一个 Sweave 模板(这需要一些工作)。但是一旦工作完成,我有一个单独的 R 脚本可以让我指出新数据。我按下“Go”,Sweave 转储出一些分数 .tex 文件,然后我运行一个小 Python 脚本来将它们全部 pdflatex。我的前任每年花大约 6 周的时间来处理这些报告;我花了大约 3 天时间(主要用于清理数据;转义字符很危险)。

现在很有可能有更好的方法,但如果你决定走这条路,请告诉我 - 我一直想提出一些我的 Sweave 黑客,这将是一件好事所以。

于 2009-09-15T22:44:02.717 回答
5

同意 Sweave 是要走的路,用xtable生成 LaTeX 表格。虽然我没有花太多时间与他们一起工作,但最近发布的tikzDevice包看起来非常有前途,尤其是与pgfSweave结合使用时(据我所知,它目前只能在 rforge.net 上使用——有一个从那里链接到 r-forge,但目前它没有响应我)。

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

于 2009-09-15T23:18:29.857 回答
4

在更“元”级别,您可能对CRISP-DM流程模型感兴趣。

于 2009-09-16T04:53:55.437 回答
4

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

于 2010-06-04T11:01:50.763 回答
4

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

  • info : pdfs, 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
  • 加载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
  • 加载数据
  • 如果需要,设置降价参数
  • render

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

98_Markdown report.Rmd
  • 报告模板

99_Shiny report.Rmd
  • 应用模板
于 2017-11-11T12:55:40.997 回答
2

我会添加我的声音来编织。对于复杂的多步骤分析,您可以使用生成文件来指定不同的部分。如果只有一个部分发生了变化,可以避免重复整个分析。

于 2009-09-16T17:22:03.843 回答
2

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

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

在更大的工作流程问题上,我喜欢 Hadley 关于枚举代码/数据文件以进行清理和分析流程的回答。我所有的数据分析项目都有类似的结构。

于 2009-09-16T05:20:43.323 回答
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/ 子文件夹中,运行它,并将结果存储在包中以便于访问。)

于 2016-10-09T17:07:22.687 回答