proc中每个变量的单独类意味着

时间:2015-10-23 13:23:55

标签: sas

我需要一次对各种变量进行总结。此外,对于每个变量,yi求和,存在链接的类变量xi。

代码看起来像这样:

proc means data=test sum;
class x1-x100;
var y1-y100;
run;

对于var y1,不使用类x1,而是使用x1-x100作为var y1的类,对于y2,...,y100使用相同的类。 我如何编写它,使得var y1具有类x1,var y2具有类x2,依此类推? 我的输出应该在一个大表中。

4 个答案:

答案 0 :(得分:2)

为什么不只是转置数据,而不是100对变量,你有一对变量和100行?我们来做一些样本数据:

data have ;
  input x1-x2 y1-y2 ;
cards;
1 1 3 4
1 2 5 6
2 1 7 8
2 2 9 0
;

现在通过将X转换为CLASS变量并将Y转换为VALUE变量来转置它。我们将使用INDEX来记录此观察所代表的许多类/值对中的哪一个。

data tall ;
  set have ;
  array x x1-x2;
  array y y1-y2;
  do index=1 to dim(x);
     class=x(index);
     value=y(index);
     output;
  end;
run;

现在我们只使用PROC SUMMARY(又名PROC MEANS)来计算总和。

proc summary nway;
  class index class ;
  var value;
  output out=want sum=sum;
run;

我们可以打印结果:

proc print ;
  var index class sum ;
run;

  index    class    sum
    1        1        8
    1        2       16
    2        1       12
    2        2        6

假设组合数量不超过可用内存量,您也可以在PROC SUMMARY之后进行转置。

首先使用WAYS 1运行PROC SUMMARY以限制使用的类变量的数量。使用CHARTYPE一次允许这么多类变量。要使结果按X1,X2,... X100的顺序出现,请以相反的顺序引用CLASSVAR语句中的变量。

proc summary data=have chartype ;
  class x2-x1;
  ways 1;
  var y2-y1;
  output out=step1 sum= ;
run;

现在取结果并使用_TYPE_变量将类变量与正确的sum变量匹配。

data want ; 
  length class_name sum_name $32 ;
  set step1 ;
  array x x2-x1 ;
  array y y2-y1 ;
  i=indexc(_type_,'1') ;
  class_name = vname(x(i));
  sum_name=vname(y(i));
  class=x(i);
  sum=y(i);
  drop _type_ i x: y: ;
run;

结果:

class_
name     sum_name    _FREQ_    class    sum
 x1         y1          2        1        8
 x1         y1          2        2       16
 x2         y2          2        1       12
 x2         y2          2        2        6

答案 1 :(得分:0)

听起来像PROC TABULATE给我。

data have;
  array x[100];
  array y[100];
  do _n_ = 1 to 1e4;
    do _i = 1 to 100;
      x[_i] = rand('BINOMIAL',.3,3);
      y[_i] = rand('UNIFORM');
    end;
    output;
  end;
run;


proc tabulate data=have;
  class x1-x100;
  var y1-y100;
  tables
     x1*y1=' '
     x2*y2=' '
     x100*y100=' ',sum;
run;

使用宏循环填充当然的完整列表。

答案 2 :(得分:0)

尝试使用call execute。

<强>修饰:

data _null_;
   set have(obs=1);
   array x x:;
   array y y:;
   do i=1 to dim(x);
      call execute(
      'proc means nway data=have sum;
          class x'||strip(i)||';
          var y'||strip(i)||';
          output out=temp sum=;
      run;');
     if i=1 then call execute(
           'data want;
            set temp(drop=_:);
         run;');
     else call execute(
          'data want;
          merge want temp(drop=_:);
        run;');
     end;
  run;

答案 3 :(得分:0)

如果它有用,可以选择汤姆和乔的解决方案。 Proc表格以创建可打印报告和输出数据集。然后处理proc选项卡中的输出数据集以根据需要组合事物。

data have ;
  input x1-x3 y1-y3 ;
cards;
1 1 3 4 5 6
1 2 5 6 7 8
2 1 7 8 9 10
2 2 9 0 11 12
;


%macro x_by_y;

    proc tabulate data=have
                    out=table_out(keep=x: y: _type_)
                    noseps
                    format=comma10.0;

        class x1-x3;
        var y1-y3;

        table
            %do i = 1 %to 3;
                x&i.*y&i.=' '
            %end;
            , sum;
    run;

    data table2(keep=classvar ysum);
        set table_out;
        array ysums[*] y:;

        x_index=indexc(_type_, '1');
        classvar= compress('x' || x_index);
        ysum = max(of ysums[*]);
    run;

    proc print data=table2 noobs;
    run;
%mend x_by_y;

%x_by_y;