SAS嵌套循环语法

时间:2017-01-15 16:43:55

标签: loops sas

我有一个可以正常读取数据集并合并它们的SAS代码。数据集根据数据的季度和年份命名,例如:"data1_Q11999""data2_Q11999"。我用来做这个的代码如下。

现在我想通过增加1999年到2014年和季度从1到4(即两个循环)来循环遍历这些数据集。

我的理解是我需要创建一个宏来执行此操作,但我在语法方面遇到了一些问题。

代码如下。我尝试使用%macro将代码包装在do loops语句中,但不断收到大量语法错误。有没有直接的方法来实现这个目标?

data origfile;
infile "D:/data1_Q11999.txt" dlm= '|' MISSOVER DSD lrecl=32767 firstobs=1 ;
input
fico : 8.
dt_first_pi : 8.
id : $16.
run;


data svcgfile;
infile "D:/data2_Q11999.txt" dlm= '|' MISSOVER DSD lrecl=32767 firstobs=1 ;
input
id : $12.
Period : 8.
actual_loss : 12.
;
run;


PROC SORT DATA=origfile OUT=origfile; 
  BY id; 
RUN; 

PROC SORT DATA=svcgfile OUT=svcgfile; 
  BY id; 
RUN; 

DATA mergedata; 
  MERGE origfile svcgfile;
  BY id; 
RUN; 

1 个答案:

答案 0 :(得分:1)

假设您要为年度季度生成一个单独的合并文件,您可以使用这样的宏。

%macro read(first_yr,last_yr);
%local year qtr;
%do year=&first_yr %to &last_yr ;
%do qtr=1 %to 4 ;
data data1;
  infile "D:\data1_Q&qtr.&year..txt" dsd dlm= '|' truncover ;
  length id $16 fico dt_first_pi 8 ;
  input fico dt_first_pi id ;
run;
proc sort data=data1; by id; run;

data data2;
  infile "D:\data2_Q&qtr.&year..txt" dsd dlm= '|' truncover ;
  length id $16 period actual_loss 8 ;
  input id period actual_loss ;
run;
proc sort data=data2; by id; run;

data result_q&qtr.&year. ;
  merge data1 data2 ;
  by id;
run;
%end;
%end;
%mend read ;

然后你可以像这样调用它来生成64个独立的数据集。

%read(1999,2014)

但您可能真的希望将这64个数据集合并为一个,以便您可以更轻松地将其用于后续步骤。您可以修复读取数据以立即生成所有数据的过程,但这里有一个简单的数据步骤,可以组合以RESULT_开头的任何数据集,就像上面的宏生成并将它们组合成一个数据集一样。 / p>

data want ;
  length year qtr 8 dsname $41 ;
  set result_: indsname=dsname ;
  year = input(substr(scan(dsname,-1,'.'),9),4.);
  qtr  = input(substr(scan(dsname,-1,'.'),8),1.);
run;