SAS:在PROC TABULATE中复制PROC MEANS输出

时间:2013-08-09 21:47:24

标签: sas

我想使用PROC TABULATE复制PROC MEANS的输出。这样做的原因是我希望将利润百分比(或保证金)作为PROC MEANS输出中的一个变量,但是想要抑制一个或多个统计数据的计算,即会有一个' - '或'在'N'和'SUM'下的'margin'行中。

以下是示例数据:

    data have;
       input username $  betdate : datetime. stake winnings;
       dateOnly = datepart(betdate) ;
       format betdate DATETIME.;
       format dateOnly ddmmyy8.;
       datalines; 
        player1 12NOV2008:12:04:01 90 -90 
        player1 04NOV2008:09:03:44 100 40 
        player2 07NOV2008:14:03:33 120 -120 
        player1 05NOV2008:09:00:00 50 15 
        player1 05NOV2008:09:05:00 30 5 
        player1 05NOV2008:09:00:05 20 10 
        player2 09NOV2008:10:05:10 10 -10 
        player2 15NOV2008:15:05:33 35 -35 
        player1 15NOV2008:15:05:33 35 15 
        player1 15NOV2008:15:05:33 35 15 
    run;

    data want;
        set have;
        retain margin;
        margin = (winnings) / stake;
    PROC PRINT; RUN;

我一直用PROC MEANS计算统计数据(如下所示),但'margin'变量的SUM统计值没有任何意义:我想抑制这个值。因此,我一直在尝试使用PROC TABULATE复制此表以更好地控制输出,但到目前为止还没有成功。

    proc means data=want N sum mean median stddev min max maxdec=2 order=freq STACKODS;
        var stake winnings margin;
    run;

    proc tabulate data=want;
        var stake winnings margin;
        table stake * (N Sum mean Median StdDev Min Max);
    run;

我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:4)

原则上,您不能将此类型的输出创建为TABULATE函数的默认部分;实质上,您要求两个不同的表定义。使用SAS语法执行的任何操作基本上都会为表添加更多维度,但它无法解决您的核心问题。

您可以使用此代码获取所需的表格,但它们仍然是不同的表格:

PROC TABULATE DATA=want NOSEPS;
    VAR stake winnings margin;
    TABLE (stake winnings),(N SUM MEAN MEDIAN STDDEV MIN MAX);
    TABLE (margin),(N MEAN MEDIAN STDDEV MIN MAX);
RUN;

有一些关于黑客ODS的指南可以做你想做的事情(即创建“堆叠表”,其中几个子表组合成一个表。查看here作为示例。如果你谷歌“SAS堆栈表”你会找到更多的例子。

我在HTML中通过创建一个新的标记集来完成这个 - 基本上,一个特殊的ODS目标,它删除了表之间的空格等等。不幸的是,我没有使用的代码了。我转到R做自动报告。