我有一个组宏变量,我想把它的类放到宏变量中。例如:
%macro test(group=);
proc freq data=foll;
tables &group / out=freqtbl;
run;
proc sql;
create table grp
(grpid char(4));
insert into grp
values('a')
values('b')
;
quit;
data freqtbl1;
merge grp freqtbl;
run;
data freqtbl2;
set freqtbl1;
call symput(grpid,&group);
run; * &a is the first group, &b is the second group;
%mend;
这适用于2个类,但是如果它有3个或3个以上的类呢?
非常感谢。
答案 0 :(得分:4)
proc sql;
select distinct age into :cls1-:cls10
from sashelp.class;
quit;
%put &cls1 &cls2 &cls3 &cls4 &cls5 &cls6 &cls7;
在使用此功能时,您仍然会知道何时停止(如上所述,&cls7
未解决)。将-:cls10
或其他任何值设置为足够高的值,不要用完变量。
如果你真的希望将它放在一个变量中,
select distinct age into :cls separated by ' '
会使& cls中包含所有值。
您也可以在数据步骤中执行此操作 - 例如:
data _null_;
set mydata;
by myvar;
initialvar=65;
if first.myvar then do;
call symput(byte(initialvar),myvar);
initialvar+1;
end;
run;
这需要您对其进行排序。您可以选择从PROC FREQ
结果数据集中运行一组类似的代码。
答案 1 :(得分:3)
此宏将为数据集的列中的每个不同观察创建一个宏变量。
Var =要为
设置一组宏变量的列dataset =
中列的数据集%macro var_for_val(dataset=,var=);
proc sql noprint;
create table dist_var as
select distinct &var.
from &dataset.
;
quit;
proc sql noprint;
create table dist_Var2 as
select monotonic() as id, &var.
from dist_var
;
quit;
proc sql noprint;
select distinct max(id)
into :max_var
from dist_var2
;
quit;
%do i = 1 %to &max_var.;
%global var_&i.;
proc sql noprint;
select distinct &var.
into :var_&i.
from dist_var2
where id = &i.
;
quit;
%put &&var_&i.;
%end;
%mend;
%var_for_val(sashelp.class,var=age);
%put &var_1.;