SAS - 使用'select into'创建宏变量,其中包含其他宏变量

时间:2015-03-30 16:15:26

标签: sas

有人可以帮助我。 我有下面的代码。它不会产生错误,但同时也达不到我想要的效果。 目的是使用' Select into'为多个列中的每个单元格创建宏变量。我认为问题在于选择'选择进入'也包含宏变量。

%macro ld_macrovar;
  proc sql noprint;
select count(portfolio)
    into :a
    from split_D;

   %do i=1 %to &max_comb.; /*already defined elsewhere -actual value=2 */

  select _&i.LGD
    into :_&i.LGD1 - :_&i.LGD%left(&a)
    from split_D;
   %end;
quit;
%mend;
%ld_macrovar;

由于

1 个答案:

答案 0 :(得分:2)

您的宏变量正被分配到宏的本地范围。因此,如果要在宏外部访问它们,则必须手动将它们分配给全局范围。这可以通过使用%global statement来实现。或者,您可以执行需要宏内部宏变量的处理。

您可以通过运行%put _ALL_; or %put _USER_来检查变量的范围。

%macro ld_macrovar(max_comb);
    proc sql noprint;
        select count(*) into :rows
        from split_D;
    quit;
    %do i = 1 %to &max_comb.;
        %do j = 1 %to &rows.;
            %global  _&i.LGD&j.;
        %end;
    %end;
    proc sql noprint;
        %do i = 1 %to &max_comb.;
            select _&i.LGD
            into :_&i.LGD1 -
            from split_D;
        %end;
    quit;
%mend;
/* Dummy data */
data split_D;
    do i = 1 to 10;
        _1LGD = i**2;
        _2LGD = exp(i);
        output;
    end;
run;
%ld_macrovar(2);
/* Print out all the user defined macro variables */
%put _USER_;

您还可以通过在%left语句中添加trimmed选项来避免将&ainto一起使用(在SAS 9.3及更高版本或{{1在其他版本中)。


提醒:如果您打算使用这些值进行进一步分析,或者有很多行,那么可以更好地实现您想要的效果。宏变量仅存储文本,当存储值时,某些精度可能会丢失。通常,当您需要参数化代码时,最好使用数据集来移动/操作数据和宏变量。