2015-10-16 79 views
0

我有一个sas程序,它合并两个包含给定城市信息的数据集。城市名称是每个数据集标题的一部分,例如亚特兰大: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)。

感谢您的帮助

+0

非常感谢kl78和克里斯j。最常用的kl78的答案,但克里斯J表明需要双周期来解决宏观变量。 –

回答

0

您的程序中有几个小错误。 执行%do循环通常在宏内完成。此外,你不使用关键字“for”,并需要在前面的%。 所以试试这个:

%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); 

除了使用macrovariable citynumber,你可以直接使用& n中的do循环中,但有一个参数的宏是更灵活的使用...

+0

我试过这段代码,但是我得到一个dir.city1.data不存在的错误。 (空)输出数据集名为city1Complete和city2Complete,而不是BostonComplete和MiamiComplete –

+0

我的错,您需要先解析宏变量,因此您需要先添加两个&&。所以&&解析为&和&我为一个数字,然后,它解析为变量值,修复了我的代码。 e.G.for i = 1:&& city&i - >&city1-> Boston。此外,上一个城市必须有一个像city42这样的名称,而不是cityN。 – kl78

+0

添加了双“&”符号,仍然出现以下信息:警告:明显的符号引用city1未解析。错误:文件work.city1.data不存在。 –

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 ; 
+0

好建议。如果你有一个数据集中的城市(我同意这是可取的),我也可以倾向于使用'call execute'并避免宏变量。 – DWal