包含数字变量的Proc报告

时间:2015-07-09 10:11:52

标签: sas

我最近在使用Proc report时遇到了一个问题,即下面的代码仅输出第一个观察结果:

data have ;
  input var1-var3 ;
datalines ;
1 10 100
2 20 200
3 30 300
4 40 400 
;run ;

proc report data=have ;
columns var1 var2 var3 ;
  define var1 / 'Variable 1' width=10;
  define var2 / 'Variable 2' width=10;
  define var3 / 'Variable 3' width=10;
run ;

它将正确报告所有4个观察结果:

  1. var1更改为字符变量(input var1 $ var2-var3
  2. 明确将define var1定义为define var1 / display
  3. 我试图弄清楚为什么会发生这种情况的逻辑。由于所有group值都是唯一的,因此将报告中的第一个变量作为数字默认值设置为display变量而不是var1,因此应该单独进行分组 - 而只报告了第一次观察。有人可以解释这个逻辑吗?

2 个答案:

答案 0 :(得分:1)

通过在proc报告声明中添加list选项,我能够找到幕后发生的事情的答案......

input var1-var3 (3x数字)将以下内容添加到日志中:

PROC REPORT DATA=WORK.HAVE LS=120 PS=44  SPLIT="/" CENTER ;
COLUMN  ( var1 var2 var3 );

DEFINE  var1 / SUM FORMAT= BEST9. WIDTH=10    SPACING=2   RIGHT "Variable 1" ;
DEFINE  var2 / SUM FORMAT= BEST9. WIDTH=10    SPACING=2   RIGHT "Variable 2" ;
DEFINE  var3 / SUM FORMAT= BEST9. WIDTH=10    SPACING=2   RIGHT "Variable 3" ;
RUN;

input var1 $ (var2 var3) (:) (先设置为字符)会将以下内容添加到日志中:

PROC REPORT DATA=WORK.HAVE LS=120 PS=44  SPLIT="/" CENTER ;
COLUMN  ( var1 var2 var3 );

DEFINE  var1 / DISPLAY FORMAT= $8. WIDTH=10    SPACING=2   LEFT "Variable 1" ;
DEFINE  var2 / SUM FORMAT= BEST9. WIDTH=10    SPACING=2   RIGHT "Variable 2" ;
DEFINE  var3 / SUM FORMAT= BEST9. WIDTH=10    SPACING=2   RIGHT "Variable 3" ;
RUN;

因此,知道数字变量的默认值SUM至少可以解释导致它的原因。虽然这会导致像这样的简单报告出现问题,但如果将var1定义为by组,则至少会正确报告总和:

data have ;
  input var1 var2 var3 ;
datalines ;
1 10 100
1 15 150
2 20 200
3 30 300
4 40 400 
;run ;

proc report data=have list ;
columns var2 var3 ;
by var1 ;
  define var2 / 'Variable 2' width=10;
  define var3 / 'Variable 3' width=10;
run ;

答案 1 :(得分:0)

您应该添加描述它们是什么类型变量的选项;如groupanalysis,如下所示:

proc report nowd data=have ;
  columns var1 var2 var3 ;
  define var1 / group width=10 'Variable 1';
  define var2 / analysis width=10 'Variable 2';
  define var3 / analysis width=10 'Variable 3'; 
run ;

结果如下:

  Variable 1  Variable 2  Variable 3
           1          10         100
           2          20         200
           3          30         300
           4          40         400