需要了解为什么每次执行都在循环外时调用执行为什么起作用?变量名每次都会被覆盖,因此我应该获取数据集中最后一个变量的结果,而不是所有111个变量的结果。
data _null_;
set basel.Data_Dictionary;
do i =1 to 111 ;
call symput('Varname',NAME);
%put &varname.;
end;
call execute ('%missimp(&varname.)');
run;
答案 0 :(得分:1)
不确定循环外的含义吗?
程序要做的第一件事是在数据_null_步骤开始之前将宏变量VARNAME的值打印到日志中。请注意,首先处理宏代码,然后将结果文本解释为您要运行的SAS代码。将%put
语句放在data
语句之前,会减少混乱。
您的数据步骤将“循环”您源数据集中的每个观察值。它将从您的输入数据中读取观察值。 DO循环将导致它将宏变量VARNAME设置为相同的值111倍。然后,它将调用名为MISSIMP的宏,该宏将使用VARNAME的值(在CALL EXECUTE语句运行时)。这将重复直到SET语句尝试读取输入数据集的末尾为止。所有这些宏调用将在当前数据步骤完成后运行。
一个简单得多的过程就是跳过CALL SYMPUT语句,并使用NAME的值生成代码以传递给CALL EXECUTE。像这样:
data _null_;
set basel.Data_Dictionary;
call execute(cats('%missimp(',NAME,')'));
run;