我有一个可以正常读取数据集并合并它们的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;
答案 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;