SAS:迭代数据集名称

时间:2015-10-16 21:03:29

标签: bash merge sas iteration

我有一个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。)

感谢您的帮助

2 个答案:

答案 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 ;