我不想在一个非常大的数据集上执行多个单独的PROC FREQ过程,而是想通过使用多个PROC FREQ语句执行一个TABLE来提高效率。我们的质量检查流程需要使用简单的TABLE语句和单个TITLE语句的表标题,但是使用多个TABLE语句可以做到这一点吗?

请看下面的示例数据和代码:

DATA TEST;
    INPUT TEMPERATURE HUMIDITY PLATE FORM $12.;
    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;

标题在输出的顶部而不是每个表的顶部彼此堆叠,因此在数据步骤中是否可能出现这种情况,还是必须创建自定义模板? PROC REPORT是自定义频率更可行的选择吗?

最佳答案

一种选择是使用proc document,虽然有些工作,但如果数据集非常大,可能会值得。我认为这与将频率输出到单独的表,然后分别对这些表进行报告或频率进行的工作量大致相同,而且也不会太杂乱。

PROC DOCUMENT 使您可以编辑输出对象,然后重播它。在您的情况下,您在频率中缺少的是表之间的分页符-SAS仅在页眉上放置title,因此您不会在表之间获取分页符。我认为PROC FREQ在run之前也不会创建任何表,因此前三个title语句不会做任何事情(您这样做是因为您使用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;

关于performance - SAS:PROC FREQ或PROC REPORT的各个表标题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35318058/

10-15 01:15