proc表示输出语句

Proc means output statement

我有一个包含多个变量的数据集,如下所示:

Data have(drop=x);
call streaminit(1);
do x = 1 to 20 by 1;
    if x < 11 then group = 'A';
    else group = 'B';
    var1 = rand('normal',0,1);
    var2 = rand('uniform');
    output;
end;
Run;

在我的分析中,我需要使用 PROC MEANS 获取一些汇总统计信息,并将每个变量的结果输出到一个数据集中。我试着用下面的代码来做,但它只包含数据集中第一个变量的统计数据。如何将剩余的变量输出到同一个数据集中?

Proc means data=have n sum mean;
By group;
Output out=want(drop=_freq_ _type_) n=n sum=sum mean=mean;
Run;


Output: 
+-------+----+----------+----------+
| group | n  | sum      | mean     |
+-------+----+----------+----------+
| A     | 10 | 4.517081 | 0.451708 |
+-------+----+----------+----------+
| B     | 10 | -0.77369 | -0.07737 |
+-------+----+----------+----------+

Desired output:
+----------+-------+----+----------+----------+
| variable | group | n  | sum      | mean     |
+----------+-------+----+----------+----------+
| var1     | A     | 10 | 4.517081 | 0.451708 |
+----------+-------+----+----------+----------+
| var1     | B     | 10 | -0.77369 | -0.07737 |
+----------+-------+----+----------+----------+
| var2     | A     | 10 | 7.947089 | 0.794709 |
+----------+-------+----+----------+----------+
| var2     | B     | 10 | 5.003049 | 0.500305 |
+----------+-------+----+----------+----------+

您请求 SAS 命名计数 n、总和 sum 和平均值 mean。 它只能对一个变量执行此操作。

这是要求SAS对每个变量的统计使用不同名称的语法:

Output out=want(drop=_freq_ _type_) 
    n(var1 var2)=n1 n2 
    sum(var1 var2)=sum1 sum2
    mean(var1 var2)=mean1 mean2;

要获得该输出,您需要转置数据。事先转置并将 _NAME_ 变量添加到 BY 或 CLASS 语句。

data have;
  call streaminit(1);
  do x = 1 to 20 by 1;
    if x < 11 then group = 'A';
    else group = 'B';
    var1 = rand('normal',0,1);
    var2 = rand('uniform');
    output;
  end;
run;
proc transpose data=have out=tall;
  by group x;
run;

proc means data=tall nway n sum mean;
  by group;
  class _name_;
  output out=want(drop=_freq_ _type_) n=n sum=sum mean=mean;
run;

或使用 /autoname 并将结果数据集从每组一个观察值转换为多个观察值。

proc means data=have(drop=x) nway n sum mean;
  by group;
  output out=wide(drop=_freq_ _type_) n= sum= mean= /autoname;
run;

proc transpose data=wide out=tall;
  by group;
run;
data tall ;
  set tall ;
  stat=scan(_name_,-1,'_');
  _name_=substrn(_name_,1,length(_name_)-length(stat) -1);
  rename _name_=varname;
run;
proc sort data=tall;
  by group varname;
run;

proc transpose data=tall out=want(drop=_name_);
  by group varname ;
  id stat;
  var col1;
run;
proc print data=want;
run;