SAS:迭代数据集名称

SAS: Iterate over dataset names

我有一个 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程序(类似于Python中的sys.argv)。

感谢您的帮助

你的程序有几个小错误。 执行 %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 而不是使用宏变量 citynumber,但是与参数一起使用宏更灵活...

如果你有编号的宏变量,你使用&&varname&i来解决它们。此外,通过将您的城市放入数据集中,您可以在它的背后创建宏变量,而不是对它们全部进行硬编码(加上计数)。

data cities ;
  input City . ;
  /* 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 ;