【问题标题】:SAS PROC REPORT Conditional Output in a ColumnSAS PROC REPORT 列中的条件输出
【发布时间】:2018-09-16 05:26:48
【问题描述】:

我正在尝试学习 SAS,特别是 PROC REPORT。我正在使用 SASHELP.CARS 数据集。

我想在输出的第 6 列中实现的目标,标记为“汽车数量 > 平均值(发票)”,以计算发票大于集团发票平均值的汽车数量。我正在使用下面的代码。

PROC REPORT DATA=sashelp.CARS NOWD OUT=learning.MyFirstReport;
COLUMNS Type Origin INVOICE=Max_INVOICE INVOICE=Mean_Invoice 
INVOICE=Count_Invoice TEST DriveTrain;
DEFINE Type / Group 'Type of Car' CENTER;
DEFINE Origin / Group 'Origin of Car' CENTER;
DEFINE Max_Invoice / ANALYSIS MAX 'Max of Invoice';
DEFINE Mean_Invoice / ANALYSIS MEAN 'Mean of Invoice';
DEFINE Count_Invoice / ANALYSIS N FORMAT=5.0 'Total Number of Cars' center;
DEFINE DriveTrain / ACROSS 'Type of DriveTrain of Car';
DEFINE TEST / COMPUTED 'Number of Cars > Mean(Invoice)' center;
COMPUTE TEST;
     TEST=N(_c7_>Mean_Invoice);
ENDCOMP;
RUN;

我得到的输出如下图所示。

Output of the above SAS code

我认为这不是正确的输出,因为列中的所有行都显示值 1。如何在输出的第 6 列中获得所需的输出?

【问题讨论】:

    标签: sas report proc


    【解决方案1】:

    非组列被定义为计算聚合统计的分析。实现逻辑评估计数的一种方法是准备数据,以便单个标志(0 或 1)的 SUM 聚合是肯定断言的计数。

    准备

    proc sql;
      create view cars_v as
      select *
      , mean(invoice) as invoice_mean_over_type_origin
      , (invoice > calculated invoice_mean_over_type_origin) as flag_50
      from sashelp.cars
      group by type, origin
      ;
    

    举报

    PROC REPORT DATA=CARS_V OUT=work.MyFirstReport;
    COLUMNS 
      Type 
      Origin 
      INVOICE/*=Max_INVOICE */
      INVOICE=INVOICE_use_2/*=Mean_Invoice */
    
      flag_50
      flag_50=flag_50_use_2
    
      flag_50_other
      DriveTrain
    ;
      DEFINE Type / Group 'Type of Car' CENTER;
      DEFINE Origin / Group 'Origin of Car' CENTER;
      DEFINE Invoice / ANALYSIS MAX 'Max of Invoice';
      DEFINE Invoice_use_2 / ANALYSIS MEAN 'Mean of Invoice';
    
      DEFINE flag_50 / analysis sum  'Number of Cars > Mean ( Invoice )' center;
    
      DEFINE flag_50_use_2 / noprint analysis N  ;
      * noprint makes a hidden column whose value is available to compute blocks;
    
      DEFINE flag_50_other / computed 'Number of Cars <= Mean ( Invoice )' center;
      DEFINE DriveTrain / ACROSS 'Type of DriveTrain of Car';
    
      compute flag_50_other;
        flag_50_other = flag_50_use_2 - flag_50.sum;
      endcomp;
    RUN;
    
    • 在较新版本的 SAS 中,NOWD 是默认选项。新的Proc REPORT 代码不需要明确指定。
    • 重用诸如invoice=mean_invoice 之类的变量是可以的,但是代码的未来读者在看到DEFINE Mean_Invoice / ANALYSIS MEAN 'Mean of Invoice'; 代码行时可能会有一些误解——这是mean 的定义或平均值的平均值 ?

    【讨论】:

    • 感谢您的回答。对此,我真的非常感激。我在其他论坛上也得到了类似的答案(我曾问过这个问题@communities.sas.com/t5/SAS-Procedures/…)。我猜在您设置一列标志的两个地方的初始逻辑都是相同的。我开始喜欢 SAS。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多