如何在宏变量中存储变量的不同值

时间:2014-01-29 22:15:29

标签: macros sas

我有一个组宏变量,我想把它的类放到宏变量中。例如:

%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个以上的类呢?

非常感谢。

2 个答案:

答案 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.;