我试图运行此代码Do循环中SAS
data swati;
input facility_id$ loan_desc : $50. sys_name :$50.;
cards;
fac_001 term_loan RM_platform
fac_001 business_loan IQ_platform
fac_002 business_loan BUSES_termloan
fac_002 business_loan RM_platform
fac_003 overdrafts RM_platform
fac_003 RCF IQ_platform
fac_003 term_loan BUSES_termloan
;
proc contents data=swati out=contents(keep=name varnum);
run;
proc sort data=contents;
by varnum;
run;
data contents;
set contents ;
where varnum in (2,3);
run;
data contents;
set contents;
summary=catx('_',name, 'summ');
run;
data _null_;
set contents;
call symput ("name" || put(_n_ , 10. -L), name);
call symput ("summ" || put (_n_ , 10. -L), summary);
run;
options mlogic symbolgen mprint;
%macro swati;
%do i = 1 %to 2;
proc sort data=swati;
by facility_id &&name&i.;
run;
data swati1;
set swati;
by facility_id &&name&i.;
length &&summ&i. $50.;
retain &&summ&i.;
if first.facility_id then do;
&&summ&i.="";
end;
if first.&&name&i. = last.&&name&i. then &&summ&i.=catx(',',&&name&i., &&summ&i.);
else if first.&&name&i. ne last.&&name&i. then &&summ&i.=&&name&i.;
run;
if last.facility_id ;
%end;
%mend;
%swati;
此代码将创建两个新的变量loan_desc_summ和sys_name_summ其中有一条线中的所有loans_desc值创建新变量以及由逗号示例(term_loan,business_loan),(RM_platform,IQ_platform)分隔的一行中的sys_names。但是,如果客户只有一个loan_desc,则loan_summ应该只有其值两次。
运行do循环的问题是,在运行此代码后,我得到的数据集只有sys_name_summ而不是loan_desc_summ。我想要包含所有五个变量的数据集facility_id,loan_desc,sys_name,loan_desc_summ,sys_name_summ。
请你帮我找出do循环中是否有问题?
嗨汤姆,谢谢你的回答。另外,你能告诉我数组总是比宏更灵活更高效吗? –
宏定义可以更灵活,因为它们正在生成代码。但通常使用实际语言的功能比使用宏等元语言生成代码更好。代码会更清晰,可能更快。 – Tom
谢谢! Tom再次回复。你能告诉我怎么才能通过宏语言改变上述代码所需的输出。我的意思是应该完成最终数据集中的哪些更改? –