0

複数の変数を持つ大規模なデータセットがあります。

これらの変数のうち 2 つ、et1 と bl1 を使用して、各変数のカテゴリを含む出力データセットを作成したいと思います。

Et1 には、数値としてコード化された 7 つのレベルがあります (ただし、数値カテゴリに適用される形式があります。

Bl1 には 4 つのレベルがあり、数値としてもコード化されています (これにもフォーマットがあります)。

理想的にはフォーマット名をデータセット名として使用して、28 個の出力データセット (et1 * 7 および bl1 * 4 = 28) を作成したいと考えています。

乾杯、ジョン

4

1 に答える 1

2
proc format;
value classa
   1='ADATA'
   2='BDATA'
;
value classb
  1='CDATA'
  2='DDATA'
;
run;

data in;
length class_a class_b $ 8;
do i=1 to 2;
   do j=1 to 2;
      class_a=trim(left(put(i,classa.)));
      class_b=trim(left(put(j,classb.)));
      someVar=ranuni(0);
      someOtherVar=ranuni(0);
      output;
   end;
end;
run;



options mprint symbolgen mlogic;

%macro separate(dsn=, classvar1=, classvar2=);

proc sql;
select distinct trim(left(&classvar1)) || '_' || trim(left(&classvar2))
into :dsnames separated by ' '
from &dsn;
quit;

data &dsnames.;
set &dsn;
%let idx=1;
%let thiscombo=%sysfunc(scan(&dsnames,&idx,%str( )));
%do %while(%length(&thiscombo) > 0);
IF ( &classvar1 = %sysfunc(quote(%sysfunc(scan(&thiscombo,1,%str(_))))) AND
     &classvar2 = %sysfunc(quote(%sysfunc(scan(&thiscombo,2,%str(_))))) )
    THEN OUTPUT &thiscombo;
    %let idx=%eval(&idx+1);
    %let thiscombo=%sysfunc(scan(&dsnames,&idx,%str( )));
%end;
run;

%mend;

%separate(dsn=in, classvar1=class_a, classvar2=class_b);
于 2013-01-18T10:27:32.840 に答える