我有一个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] 删除。
我来说两句