我有一个sas程序,它合并了两个包含给定城市信息的数据集。城市名称是每个数据集标题的一部分,例如亚特兰大:
data work.AtlantaComplete;
merge dir.Atlanta1 dir.Atlanta2;
by mergevar;
run;
我想在很长的城市列表上运行合并,而不必为每个城市制作单独的.sas文件。由于SAS知识有限,我尝试了以下方法:
%let city1 = Boston;
...
%let cityN = Miami;
%DO for i = 1 to N;
data work.city&i;
set dir.city&i.1 dir.city&i.2;
by mergevar;
run;
这产生了几个错误,主要是%DO语句必须在数据步骤中。这对我的任务不起作用,因为必须在第一个数据步骤之前定义循环。
可以在sas程序中实现的解决方案是最佳的,但我也喜欢Unix Bash shell脚本,它一次为每个城市提供一个作为sas程序的系统输入(类似于sys) Python中的.argv。)
感谢您的帮助
答案 0 :(得分:0)
你的程序中有几处小错误。 执行%do循环通常在宏内完成。你也不要使用关键字“for”并在to前面需要一个%。 所以试试这个:
%let city1 = Boston;
...
%let cityN = Miami;
%let N = 42; *or whatever your N is...;
%macro mergecities(citynumber);
%DO i = 1 %to &citynumber;
data work.&&city&i;
set dir.&&city&i dir.&&city&i;
by mergevar;
run;
%end;
%mend;
%mergecities(&N);
您可以直接在do循环中使用& N而不是使用macrovariable citynumber,但是与参数一起使用时,宏更灵活...
答案 1 :(得分:0)
如果您有编号的宏变量,则使用&&varname&i
来解决它们。此外,通过将您的城市放在数据集中,您可以在其后面创建宏变量,而不是对它们进行硬编码(加上计数)。
data cities ; input City $20. ; /* Create numbered macro variables based on _n_ */ call symputx(cats('CITY',_n_),City) ; call symputx('N',_n_) ; datalines ; Atlanta Boston Chicago Houston Texas ; run ; %MACRO LOOP ; %DO I = 1 %TO &N ; data &&CITY&I..Complete ; merge dir.&&CITY&I..1 dir.&&CITY&I..2 ; by mergevar ; run ; %END ; %MEND ; %LOOP ;