用于统计分析和报告撰写的工作stream程
有没有人有任何关于自定义报告写作相关的数据分析的工作stream程的智慧? 用例基本上是这样的:
-
客户委托使用数据分析的报告,例如水域的人口估计和相关地图。
-
分析人员下载一些数据,调用数据并保存结果(例如,为每个单位的人口数量添加一列,或者根据地区边界对数据进行子集)。
-
分析师分析(2)中创build的数据,接近她的目标,但是看到需要更多数据,因此回到(1)。
-
冲洗重复,直到表和graphics符合质量保证/质量控制,并满足客户。
-
写报告合并表和graphics。
-
明年,快乐的客户回来,想要更新。 这应该与通过新下载更新上游数据一样简单(例如获得去年的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
我通常把我的项目分成四部分:
- load.R
- clean.R
- func.R
- 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程,所以这是值得一读:
- 准备数据。
- 准备报告模板。
- 生成报告。
实际上,前两步完成后生成报告非常简单:
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包,因为它帮助我构造我的代码和数据,而且与其他人分享也很容易。
- 创build我的包
- 加载
- 清洁
- 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
- 总结,模型…
- 报告
excel
和csv
文件
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
- 应用程序模板