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