【发布时间】:2017-05-19 20:05:21
【问题描述】:
我正在运行一个在数据步骤中调用执行的宏。 我想从我的数据步骤中得到以下内容:
获取一个表,为每个现有列添加一个新列(通过宏),最后添加一个新列,该列是其他两个列的总和。 我想没有宏也是可能的,但我想要这样,因为我是 SAS 新手,想了解宏的逻辑并调用执行。
假设我有下表:
data values;
input a1 a2 b1 b2;
datalines;
1 0 3 10
0 5 6 11
7 8 9 0
;
run;
还有这个宏:
%macro loop1(myDataset);
proc contents data=&myDataset. out=Col_Names (keep=Name) noprint;
run;
proc sql noprint;
select count(Name) into :length from Col_Names;
quit;
%do j = 1 %to &length;
data &myDataset.;
set &myDataset.;
n&j=0;
run;
%end;
%mend;
然后以下数据步骤在我运行它的前 3 次创建不同的输出: (每次运行后,我当然会使用数据线重新运行原始数据步骤)
data values;
set values;
if _n_=1 then call execute('%loop1(values);');
test=sum(a1,a2);
run;
第一次运行出现错误:
警告:未解析明显的符号引用 LENGTH。错误:一个 在 %EVAL 函数或 %IF 条件中找到字符操作数 其中需要数字操作数。条件是: &length 错误:%DO J 循环的 %TO 值无效。错误:宏 LOOP1 将停止执行。
第二次运行的结果正是我想要的:
a1、a2、b2、b2、test、n1、n2、n3、n4 列
从第三次运行开始,输出保持不变:
a1、a2、b2、b2、test、n1、n2、n3、n4、n5 列
里面有不想要的n5。
我应该如何更改才能始终获得第二次运行的输出?
【问题讨论】:
标签: macros sas execute sas-macro datastep