【问题标题】:How to store the distinct values of a variable in macro variable(s)如何将变量的不同值存储在宏变量中
【发布时间】:2014-02-22 00:12:31
【问题描述】:

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

%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 个类怎么办?

非常感谢。

【问题讨论】:

  • 在这种情况下什么是“类”?
  • sex=f/m, status=y/n 等
  • 那么您想创建包含变量唯一值的宏变量吗?

标签: macros sas


【解决方案1】:
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 结果数据集上运行一组类似的代码。

【讨论】:

  • 是的,这很有帮助。谢谢!
【解决方案2】:

此宏将为数据集列中的每个不同观察结果创建一个宏变量。

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

【讨论】:

  • 这在宏中很棒。谢谢!希望我能标记两个正确答案。
  • @Autumn 您可以在其中一种或两种情况下投票,以表明您认为这是一个有用的答案(绿色向上箭头)。
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多