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

标签 sas

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

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

谢谢

最佳答案

您的宏变量被分配到宏的本地范围。因此,如果您想在宏外部访问它们,则必须手动将它们分配到全局范围。这可以通过使用 %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_;

您还可以通过添加 trimmed 来避免将 %left&a 一起使用。第一个 into 语句的选项(在 SAS 9.3 及更高版本中或在其他版本中用“”分隔)。


警告:如果您计划使用这些值进行进一步分析或者有很多行,则可能有更好的方法来实现您想要的效果。宏变量仅存储文本,存储值时可能会丢失一些精度。一般来说,当您需要参数化代码时,最好使用数据集来移动/操作数据和宏变量。

关于SAS - 使用 'select into' 创建宏变量,其中包含其他宏变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29351150/

相关文章:

SAS 向后保留

SAS DM 'close table'

sas - 将 CHAR 转换为具有不同小数位的 NUM

regex - 使用 PRXNEXT 捕获关键字的所有实例

sql-server - 在 SAS 中使用 wlatin1 编码读取 session 中的 unicode 字符

SAS %while 循环条件未正确评估

sas - 在 SAS 的观察中连接所有变量

excel - 将 Excel 文件读入 SAS 数据集

sas - 宏似乎陷入无限循环,不知道如何调试

sas - 将日期时间转换为 proc-sql sas 中的日期