/*用宏程序按照数据集中的BY分组变量来创建不同的数据集*/
data test;
input color $ num;
datalines;
blue 1
blue 2
blue 3
green 4
green 5
red 6
red 7
red 8
;
/* 创建一个新的宏变量VARn*/
/* 创建一个新变量flag,这个用来记录每一组,按照BY分了三组,每一组里面的FLAG是一样的,但是不同的COLOR组是不一样,递增的关系
例如1,2,3然后根据FLAG创建宏变量
VAR1 VAR2 VAR3.....*/
data we;
set test end=eof;
by color;
if first.color then do;
flag+1;
call symput('var'||put(flag,8. -L),color);
end;
/* 最后一个观测时,将此时的FLAG创建并赋值给宏变量TOT,也就是TOT这个宏变量记录了分组数 */
if eof then call symput('tot',put(flag,8. -L));
run;
/* 动态创建数据集,根据宏变量根据IF THEN语句判断输出到不同的数据集中*/
%macro groups(dsn,byvar);
data %do i=1 %to &tot; /*如果TOT=3的话,那么就是等价于&var1,&var2,&var3*/
&&var&i
%end;;
set &dsn;
%do i=1 %to &tot;
if &byvar="&&var&i" then output &&var&i;
%end;
run;
%mend groups;
%groups(test,color)
proc print data=blue;
title 'Blue';
run;
proc print data=green;
title 'Green';
run;
proc print data=red;
title 'Red';
run;
这里有一个技巧就是
call symput('var'||put(flag,8. -L),color);
这句是创建的一个系列的宏变量,而不是一个宏变量
可以对照symget来看看
|