【问题标题】:SAS: Individual Table Titles for PROC FREQ or PROC REPORT?SAS:PROC FREQ 或 PROC REPORT 的单个表标题?
【发布时间】:2016-05-20 23:21:44
【问题描述】:

我不想在一个非常大的数据集上执行多个单独的PROC FREQ 过程,而是希望通过执行单个PROC FREQ 和多个TABLE 语句来提高效率。我们的 QA 流程需要使用单个 TITLE 语句的单个 TABLE 语句很简单的表标题,但是使用多个 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 能否成为自定义频率更可行的选择?

【问题讨论】:

    标签: performance sas report title frequency


    【解决方案1】:

    在这种情况下,我建议使用宏路由。从长远来看,可能也会节省代码。使用您的 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);
    

    【讨论】:

    • 我相信 Foxer 查询的重点是避免数据的多次传递。
    • 你是对的,@data_null_。我试图避免一个宏和FREQ多次使用同一个大型数据集。
    • 使用哈希解决方案并获取数据以打印/显示不是更快吗?
    • @Reeza PROC FREQ 也很快,我不认为我可以编写一个比 PROC FREQ 更快(并且同样可靠)的哈希解决方案。
    【解决方案2】:

    一个选项是使用proc document,这有点工作,但如果数据集非常大,可能值得。我认为这与将频率输出到单独的表格中然后分别对这些表格进行报告或频率进行的工作量大致相同,并且不那么混乱。

    PROC DOCUMENT 允许您编辑输出对象,然后重播它。在您的情况下,您在频率中缺少的是表之间的分页符 - SAS 仅在页眉上放置 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多