SAS:PROC FREQ 或 PROC REPORT 的个人 Table 标题?
SAS: Individual Table Titles for PROC FREQ or PROC REPORT?
我不想在非常大的数据集上执行多个单独的 PROC FREQ
过程,而是想通过执行单个 PROC FREQ
和多个 TABLE
语句来提高效率。我们的 QA 流程需要 table 个标题,这对于使用单个 TITLE
语句的单个 TABLE
语句很简单,但是对于多个 TABLE
语句这可能吗?
以下面的示例数据和代码为例:
DATA TEST;
INPUT TEMPERATURE HUMIDITY PLATE FORM .;
DATALINES;
25 75 1 HOT
30 75 2 COLD
25 45 3 HOT
30 45 4 COLD
25 55 5 HOT
30 55 6 COLD
25 15 7 HOT
30 15 8 COLD
;
RUN;
** SINGLE PASS ON PROC FREQ **;
PROC FREQ DATA = TEST;
TITLE1 "TEMPERATURE FREQS";
TABLE TEMPERATURE / LIST OUT=FREQS_TEMP;
TITLE2 "HUMIDITY FREQS";
TABLE HUMIDITY / LIST OUT=FREQS_HUM;
TITLE3 "PLATE FREQS";
TABLE PLATE / LIST OUT=FREQS_PLATE;
TITLE4 "FORM FREQS";
TABLE FORM / LIST OUT=FREQS_FORM;
RUN;TITLE1;TITLE2;TITLE3;TITLE4;
标题在输出的最顶部堆叠在一起,而不是每个 table,那么在数据步骤中是否可能出现这样的情况,或者是否必须创建自定义模板? PROC REPORT
能否成为自定义频率的更可行选择?
一个选项是使用 proc document
,这需要一些工作,但如果数据集非常大,则值得这样做。我认为这与将频率输出到单独的表然后分别对这些表进行报告或频率的工作量大致相同,而且不那么混乱。
PROC DOCUMENT
允许您编辑输出 object 然后重播它。在你的情况下,你在 freq 中缺少的是表之间的分页符 - SAS 只在页面 header 上放置一个 title
,所以你不会在表之间得到它。我认为 PROC FREQ 在 run
之前也不会创建任何表,因此前三个标题语句不会做任何事情(你的只是因为你使用 titel1/2/3/4 - 如果你使用 title
每次只有第四个会生效。
您需要先添加分页符,然后添加标题(不幸的是,您没有将它们保留在 PROC FREQ 中,因此您可以将它们从中删除)。所以:
*ODS DOCUMENT creates the DOCUMENT object you will later modify;
ods document name=freqs(write);
** SINGLE PASS ON PROC FREQ **;
PROC FREQ DATA = TEST;
TITLE "TEMPERATURE FREQS";
TABLE TEMPERATURE / LIST OUT=FREQS_TEMP;
TITLE "HUMIDITY FREQS";
TABLE HUMIDITY / LIST OUT=FREQS_HUM;
TITLE "PLATE FREQS";
TABLE PLATE / LIST OUT=FREQS_PLATE;
TITLE "FORM FREQS";
TABLE FORM / LIST OUT=FREQS_FORM;
RUN;
title;
ods document close;
*PROC DOCUMENT is an interactive proc, so it stays active until QUIT;
proc document name=freqs;
*Just a look at what it looks like under the hood - can be removed in production;
list/levels=all;
run;
*Here we create page breaks (OBPAGE command) after each table.;
obpage \Freq#1\Table1#1\OneWayFreqs#1 /after;
obpage \Freq#1\Table2#1\OneWayFreqs#1 /after;
obpage \Freq#1\Table3#1\OneWayFreqs#1 /after;
*Here we add the titles.;
obtitle \Freq#1\Table1#1\OneWayFreqs#1 "TEMPERATURE FREQS";
obtitle \Freq#1\Table2#1\OneWayFreqs#1 "HUMIDITY FREQS";
obtitle \Freq#1\Table3#1\OneWayFreqs#1 "PLATE FREQS";
obtitle \Freq#1\Table4#1\OneWayFreqs#1 "FORM FREQS";
*And here we replay the document with the changes;
replay ^;
run;
quit;
在这种情况下,我建议使用宏路由。可能也节省了长 运行 中的代码。用你的 PROC FREQ
创建一个宏并多次调用它。
%macro freq_out(VName, VSub);
proc freq data=test;
title "&VName Freqs";
table &vname/list out=freqs_&vsub;
run;
%mend;
%freq_out(Temperature, Temp);
%freq_out(Humidity, Hum);
我不想在非常大的数据集上执行多个单独的 PROC FREQ
过程,而是想通过执行单个 PROC FREQ
和多个 TABLE
语句来提高效率。我们的 QA 流程需要 table 个标题,这对于使用单个 TITLE
语句的单个 TABLE
语句很简单,但是对于多个 TABLE
语句这可能吗?
以下面的示例数据和代码为例:
DATA TEST;
INPUT TEMPERATURE HUMIDITY PLATE FORM .;
DATALINES;
25 75 1 HOT
30 75 2 COLD
25 45 3 HOT
30 45 4 COLD
25 55 5 HOT
30 55 6 COLD
25 15 7 HOT
30 15 8 COLD
;
RUN;
** SINGLE PASS ON PROC FREQ **;
PROC FREQ DATA = TEST;
TITLE1 "TEMPERATURE FREQS";
TABLE TEMPERATURE / LIST OUT=FREQS_TEMP;
TITLE2 "HUMIDITY FREQS";
TABLE HUMIDITY / LIST OUT=FREQS_HUM;
TITLE3 "PLATE FREQS";
TABLE PLATE / LIST OUT=FREQS_PLATE;
TITLE4 "FORM FREQS";
TABLE FORM / LIST OUT=FREQS_FORM;
RUN;TITLE1;TITLE2;TITLE3;TITLE4;
标题在输出的最顶部堆叠在一起,而不是每个 table,那么在数据步骤中是否可能出现这样的情况,或者是否必须创建自定义模板? PROC REPORT
能否成为自定义频率的更可行选择?
一个选项是使用 proc document
,这需要一些工作,但如果数据集非常大,则值得这样做。我认为这与将频率输出到单独的表然后分别对这些表进行报告或频率的工作量大致相同,而且不那么混乱。
PROC DOCUMENT
允许您编辑输出 object 然后重播它。在你的情况下,你在 freq 中缺少的是表之间的分页符 - SAS 只在页面 header 上放置一个 title
,所以你不会在表之间得到它。我认为 PROC FREQ 在 run
之前也不会创建任何表,因此前三个标题语句不会做任何事情(你的只是因为你使用 titel1/2/3/4 - 如果你使用 title
每次只有第四个会生效。
您需要先添加分页符,然后添加标题(不幸的是,您没有将它们保留在 PROC FREQ 中,因此您可以将它们从中删除)。所以:
*ODS DOCUMENT creates the DOCUMENT object you will later modify;
ods document name=freqs(write);
** SINGLE PASS ON PROC FREQ **;
PROC FREQ DATA = TEST;
TITLE "TEMPERATURE FREQS";
TABLE TEMPERATURE / LIST OUT=FREQS_TEMP;
TITLE "HUMIDITY FREQS";
TABLE HUMIDITY / LIST OUT=FREQS_HUM;
TITLE "PLATE FREQS";
TABLE PLATE / LIST OUT=FREQS_PLATE;
TITLE "FORM FREQS";
TABLE FORM / LIST OUT=FREQS_FORM;
RUN;
title;
ods document close;
*PROC DOCUMENT is an interactive proc, so it stays active until QUIT;
proc document name=freqs;
*Just a look at what it looks like under the hood - can be removed in production;
list/levels=all;
run;
*Here we create page breaks (OBPAGE command) after each table.;
obpage \Freq#1\Table1#1\OneWayFreqs#1 /after;
obpage \Freq#1\Table2#1\OneWayFreqs#1 /after;
obpage \Freq#1\Table3#1\OneWayFreqs#1 /after;
*Here we add the titles.;
obtitle \Freq#1\Table1#1\OneWayFreqs#1 "TEMPERATURE FREQS";
obtitle \Freq#1\Table2#1\OneWayFreqs#1 "HUMIDITY FREQS";
obtitle \Freq#1\Table3#1\OneWayFreqs#1 "PLATE FREQS";
obtitle \Freq#1\Table4#1\OneWayFreqs#1 "FORM FREQS";
*And here we replay the document with the changes;
replay ^;
run;
quit;
在这种情况下,我建议使用宏路由。可能也节省了长 运行 中的代码。用你的 PROC FREQ
创建一个宏并多次调用它。
%macro freq_out(VName, VSub);
proc freq data=test;
title "&VName Freqs";
table &vname/list out=freqs_&vsub;
run;
%mend;
%freq_out(Temperature, Temp);
%freq_out(Humidity, Hum);