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; 
汤姆

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

%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_上面的宏开头的所有数据集进行合并,然后将它们合并为一个数据集。

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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章