这原则上可以使用PROC DOCUMENT
和ODS DOCUMENT
输出类型。这本身并不容易,但它是可能的,并且比宏选项有一些优势,尽管我不确定是否足以推荐它的使用。然而,它仍然值得探索。
首先,这在很大程度上是由 Cynthia Zender 的优秀教程指导(包括,巧合的是,使用相同的数据集!),Have It Your Way: Rearrange and Replay Your Output with ODS DOCUMENT,在 2009 年 SAS 全球论坛上发表。她最初描述了一种执行此操作的 GUI 方法,但后来在代码中对其进行了解释,这对于这类事情显然更胜一筹。Kevin Smith 在 2012 年 SGF 的ODS DOCUMENT From Scratch中涵盖了类似的内容,尽管 Cynthia 的论文在这里更适用(因为她涵盖了确切的主题)。
首先,您需要生成所有结果。在这里订购并不重要。我生成了一个按国家/地区适当排序的 SASHELP.PRDSALE 样本。
proc sort data=sashelp.prdsale out=prdsale;
by country;
run;
然后,我们生成一些表;一个proc手段和一个sgplot。请注意标题用于#BYVAL1
确保包含标题 - 否则我们会丢失 procs 上的有用标签!
title "#BYVAL1 Report";
ods _all_ close;
ods document name=work.mydoc(write);
proc means data=prdsale sum;
by country;
class quarter year;
var predict;
run;
proc sgplot data=prdsale;
by country;
vbar quarter/response=predict group=year groupdisplay=cluster;
run;
ods document close;
ods preferences;
现在,我们有一些错误,但可用于您真正想要的。您可以使用 Cynthia 或 Kevin 论文中的技术详细研究这一点;现在,我将介绍您为此目的所需要的内容。
它现在是这样组织的,想象一个文件夹树:
\报告\意味着\国家\
我们需要的是:
\报告\国家\手段
这很容易做到。执行此操作的代码如下。显然,对于生产过程,这将是更好的自动化;给定输入数据集,生成此代码应该很简单。请注意,BYVAL 是按值递增的,因此 CANADA 是 1 和 4,GERMANY 是 2 和 5,USA 是 3 和 6。
proc document name=work.mydoc_new(write);
make CANADA, GERMANY, USA; *make the lower level folders;
run;
dir ^^; *Go to the bottom level, think "cd .." in unix/windows;
dir CANADA; *go to Canada folder;
dir; *Notes to the Listing destination where we are, not that important;
copy \work.mydoc\Means#1\ByGroup1#1\Summary#1 to ^; *copy that folder from orig doc to here;
copy \work.mydoc\SGPlot#1\ByGroup4#1\SGPlot#1 to ^; *^ being current directory, like '.' in unix/windows;
*您也可以复制 \ByGroup1#1 和 \Bygroup4#1 而没有树的最后一层。这会产生稍微不同的结果(表格周围会包含更多的文字),所以无论哪个符合您的期望。
**这里德国和美国也一样。请注意,这是易于自动化的部分!目录^^; 目录德国;目录;复制 \work.mydoc\Means#1\ByGroup2#1\Summary#1 到 ^; 复制 \work.mydoc\SGPlot#1\ByGroup5#1\SGPlot#1 到 ^;
dir ^^;
dir USA;
dir;
copy \work.mydoc\Means#1\ByGroup3#1\Summary#1 to ^;
copy \work.mydoc\SGPlot#1\ByGroup6#1\SGPlot#1 to ^;
run;
quit; *this is one of those run group procedures, need a quit;
现在,您只需要以replay
正确的方式将其取出。
proc document name=mydoc_new;
replay;
run;
quit;
塔达,你有你想要的。