SAS SymputX和Symget功能

时间:2016-11-11 11:27:57

标签: sas sas-macro

我尝试通过编写下面的SAS代码来构建表2,但我得到的是表1.我无法弄清楚我错过了什么。非常感谢谢谢。

     &counter = 4

     data new;set set1;
     total = 0;
     a = 1;
     do i = 1 to &counter;
       call symputX('a',a);
       total = total + Tem_&a.;
       a = symget('a')+1;
       call symputX('a',a);
     end;
     run;



      Table 1
      ID    Amt Tem_1   Tem_2   Tem_3   Tem_4   total
       4    500    1        4       5    900    3600
       5    200   50      100     200      0       0
       9    50    40        0       0      0       0
      10    500   70      100     250      0       0



     Table 2
     ID Amt Tem_1   Tem_2   Tem_3   Tem_4   total
      4 500    1        4       5    900     910
      5 200   50      100     200      0     350
      9 50    40        0       0      0      40
     10 500   70      100     250      0     420

1 个答案:

答案 0 :(得分:2)

不幸的是,你不能以这种方式使用SYMPUT和SYMGET。虽然您可以使用它们来存储/检索宏变量值,但您无法在执行后更改发送到编译器的代码。

基本上,SAS在查看任何数据(这称为编译)之前,必须弄清楚机器代码在数据步循环的每次迭代中应该做什么。所以问题是,你不能定义tem_&a.并期望被允许改变执行期间_&a.的内容,因为它会改变机器代码需要做的事情,而SAS无法&# 39;为此做好充分准备。

因此,编写程序时,您编写&a.的内容将被解析,而&a.在您的数据步骤之前所具有的值tem_&a.将成为&a. does not resolve。大概是你第一次运行它时会出错(call symput然后出现关于变量名称非法的错误),最后&a完成了它的工作,tem_&a.得到了4在循环结束时,你的tem_4将永远解决为 data new; set set1; total = 0; array tem[&counter.] tem_1-tem_&counter.; a = 1; do i = 1 to &counter; *or do i = 1 to dim(tem); total = total + Tem[i]; end; run;

解决方案?不要为此使用宏。相反,使用数组。

data new;
  set set1;
  total = sum(of tem_1-tem_4);
run;

或者,当然,只是直接总结它们。

  data new;
     set set1;
     total = 0;
     %do i = 1 %to &counter;
       total = total + Tem_&i.;         
     %end;
  run;

如果你真的喜欢宏变量,你当然可以在 do循环中执行此操作,尽管这是为此建议的,因为它是最好坚持使用数据步骤技术。但无论如何,如果你在宏中运行它(这在开放代码中无效),这应该可行。

is_login(tinyint)