Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可再现性研究:使用GNU make调用statTransfer将sas7bdat数据文件转换为csv文件 问题:_R_Csv_Makefile_Reproducible Research - Fatal编程技术网

可再现性研究:使用GNU make调用statTransfer将sas7bdat数据文件转换为csv文件 问题:

可再现性研究:使用GNU make调用statTransfer将sas7bdat数据文件转换为csv文件 问题:,r,csv,makefile,reproducible-research,R,Csv,Makefile,Reproducible Research,我是GNU的新手。是否有更好的方法通过编程将统计数据集从sas7bdat转换为csv文件,并使用GNU Make使它们彼此保持同步,以促进可复制的研究?您是从编码的角度来处理这个问题,还是有更好的方法来促进可重复性研究?在使用静态模式规则时,是否可以添加额外的先决条件(即statTransferOptions.txt) 解决方案需要: 在所有子目录中查找所有sas7bdat文件 读取statTransfer选项 使用带选项的statTransfer命令行工具将sas7bdat文件转换为csv文

我是GNU的新手。是否有更好的方法通过编程将统计数据集从sas7bdat转换为csv文件,并使用GNU Make使它们彼此保持同步,以促进可复制的研究?您是从编码的角度来处理这个问题,还是有更好的方法来促进可重复性研究?在使用静态模式规则时,是否可以添加额外的先决条件(即
statTransferOptions.txt

解决方案需要:

  • 在所有子目录中查找所有sas7bdat文件
  • 读取statTransfer选项
  • 使用带选项的statTransfer命令行工具将sas7bdat文件转换为csv文件
  • 鉴于目前statTransfer的局限性,我认为这将需要两个步骤:
    • 为每个SAS数据文件(.sas7bdat)生成statTransfer命令文件(.stcmd)
    • 通过使用stcmd文件中的选项执行statTransfer(st),为每个stcmd文件构建csv文件
    • 目标stcmd和csv文件应与必备的sas7bdat文件位于同一子目录中
    • 如果存在新的sas7bdat文件或基本选项文件发生更改,请查找过期的stcmd和csv文件并更新它们
背景: 我继承了一份每年出版的大型统计报告。在前几年,分析是在SAS中进行的。我们现在使用的是R。SAS Enterprise Guide生成的一些sas7bdat文件无法正确导入。StatTransfer是一款商用产品,它有一个命令行界面,可以正确地将sas7bdat文件转换为csv文件;但是,有一些选项可以改进转换(例如,写入日期格式)。sas7bdat文件位于与数据集类型和年份对应的多个子目录中

这一方法的进一步推动因素是:

克里斯托弗·甘德鲁(2013-06-21)。利用R和RStudio进行可复制研究(查普曼和霍尔/CRC R系列)(第104-105页)。查普曼和霍尔/儿童权利中心。Kindle版

故障排除:
  • 这几乎就是我想要的:
建议的MAKEFILE?
RDIR:=。
######
#准备#
######
#使用bashshell创建源sas7bdat文件的列表
SASDATA=$(shell find$(RDIR)-type f-name'*.sas7bdat')
#使用模式子字符串函数定义文件名的变量列表
#在配方中用作目标
STCMD_OUT=$(patsubst$(RDIR)/%.sas7bdat,$(RDIR)/%.STCMD,$(SASDATA))
CSV_OUT=$(patsubst$(RDIR)/%.sas7bdat,$(RDIR)/%.CSV,$(SASDATA))
#########
#目标#
#########
全部:$(STCMD\u OUT)$(CSV\u OUT)
#我认为“静态模式规则”这个名字有误导性
#但我发现这很有帮助:
# http://www.gnu.org/software/make/manual/make.html#Static-图案
#我可以在使用静态模式规则时添加statTransferOptions.txt作为先决条件吗?
$(STCMD_OUT):$(RDIR)/$(@D)/%.STCMD:$(RDIR)/$(@D)/%.sas7bdat
cp$(RDIR)/statTransferOptions.txt$@
回显副本$(RDIR)/$$@
回声退出>>$@
$(CSV_OUT):$(RDIR)/$(@D)/%.CSV:$(RDIR)/$(@D)/%.stcmd
新加坡元/$<
清洁:
rm$(标准货币单位)
rm$(CSV_OUT)
SO输入后修订的MAKEFILE:
RDIR:=。
######
#准备#
######
#创建源sas7bdat文件的列表
SASDATA:=$(shell find$(RDIR)-类型f-名称'*.sas7bdat')
STCMD_OUT:=$(patsubst$(RDIR)/%.sas7bdat,$(RDIR)/%.STCMD,$(SASDATA))
CSV_OUT:=$(patsubst$(RDIR)/%.sas7bdat,$(RDIR)/%.CSV,$(SASDATA))
#########
#目标#
#########
全部:$(STCMD\u OUT)$(CSV\u OUT)
$(STCMD_OUT):%.STCMD:%.sas7bdat statTransferOptions.txt
cp$(RDIR)/statTransferOptions.txt$@
回显副本$(RDIR)/$$@
回声退出>>$@
$(CSV_OUT):%.CSV:%.stcmd
新加坡元/$<
清洁:
rm$(标准货币单位)
rm$(CSV_OUT)

然而,正确的选择可能是调试CRAN sas7bdat包,以便整个工具链可用,而不是调用专有的statTransfer。

因此,我们通常没有时间或精力(或者通常没有兴趣)阅读相关论文、选项、备选方案等。如果您简单明确地指定您遇到问题的代码(在本例中,提供的makefile非常好)、您遇到的确切问题,包括错误消息或不正确的输出(这在您的问题中并不明显),则效果最佳,你想发生的事情没有发生,因为这并不总是清楚的,也许还有你尝试过但没有成功的其他想法或方向

我不确定您到底遇到了什么问题,但我发现您的makefile存在许多问题。首先,这会起作用,但效率很低:

SASDATA = $(shell find $(RDIR) -type f -name '*.sas7bdat')
您应该在此处使用
:=
赋值形式。在设置
STCMD\u OUT
CSV\u OUT
时可能也应该使用它,尽管这不太重要

但最重要的是,这些规则并不正确:

$(STCMD_OUT): $(RDIR)/$(@D)/%.stcmd: $(RDIR)/$(@D)/%.sas7bdat
您不能在目标或先决条件列表中使用自动变量,如
$@
(或其任何替代形式)。自动变量仅在规则配方中定义。您可以对此使用二次扩展,但我不确定您为什么要尝试这样做。为什么不使用:

$(STCMD_OUT): %.stcmd: %.sas7bdat
?其他静态模式规则同上


至于您的问题,是的,可以在静态模式规则中添加额外的先决条件,例如
statTransferOptions.txt

您是否使用示例sas文件向sas7bdat的维护人员报告了导入失败?不幸的是,否。该包与其他sas7bdat文件一起工作,失败的文件很大(>100 MB)并且拥有无法共享的专有信息。如果这取决于数据的结构(而不是纯粹的大小),那么可能很容易创建一个以同样方式失败的小文件。但没关系。我不认为将StatTransfer合并到复制所需的工作流程中
$(STCMD_OUT): $(RDIR)/$(@D)/%.stcmd: $(RDIR)/$(@D)/%.sas7bdat
$(STCMD_OUT): %.stcmd: %.sas7bdat