对同一个问题,论坛里面的大牛通常可以给出不同的解决方案。其中,DATA步和BASE模块程序就可以殊途同归。SAS Global Forum 2011中有篇文章对部分情况作了概括,《Choosing the Road Less Traveled: Performing Similar Tasks with either SAS®
DATA Step Processing or with Base SAS® Procedures》 ——Kathryn McLawhorn, SAS Institute Inc., Cary, NC
这里摘录了文章的代码。
1.CALCULATING THE NUMBER OF OBSERVATIONS IN A BY GROUP
DATA STEP METHOD
proc sort data=sashelp.class out=class(keep=age);
by age;
run;
data class1;
set class;
by age;
if first.age then count=0;
count+1;
if last.age then output;
run;
proc print noobs;
run;
PROC FREQ
proc freq data=sashelp.class;
tables age / out=class2(drop=percent);
run;
proc print data=class2 noobs;
run;
2.COMPUTING A TOTAL FOR A BY GROUP
DATA STEP
data scores;
input id $ game1 game2;
datalines;
A 2 3
A 5 6
B 1 2
C 1 2
C 4 5
C 7 8
;
run;
proc sort data=scores;
by id;
run;
data grandtot(drop=temp1 temp2);
set scores (rename=(game1=temp1 game2=temp2));
by id;
if first.id then do;
game1=0;
game2=0;
end;
game1+temp1;
game2+temp2;
if last.id then output;
run;
proc print data=grandtot noobs;
run;
PROC MEANS
proc means data=scores noprint nway;
class id;
var game1 game2;
output out=new(drop=_type_ _freq_) sum=;
run;
proc print data=new noobs;
run;
PROC REPORT
proc report data=scores nowd;
column id game1 game2;
define id / order ;
define game1 / analysis sum format=4.;
define game2 / analysis sum format=4.;
title 'proc report';
run;
3.COMPUTING AN AVERAGE FOR A BY GROUP
DATA STEP
data test;
input I J X;
cards;
1 1 123
1 1 3245
1 2 23
1 2 543
1 2 87
1 3 90
2 1 88
2 1 86
;
run;
proc sort data=test;
by i j;
run;
data jsubtot(keep=i j freq avg);
set test;
by i j;
retain jsub freq;
if first.j then do;
jsub=0;
freq=0;
end;
jsub+x;
freq+1;
if last.j then do;
avg=jsub/freq;
output;
end;
run;
proc print data=jsubtot noobs;
run;
PROC MEANS
proc means data=test noprint nway;
class i j;
var x;
output out=jsubtot2(drop=_type_ rename=(_freq_=freq)) mean=avg;
run;
proc print data=jsubtot2 noobs;
run;
4.COMPUTING A PERCENTAGE FOR A BY GROUP
DATA STEP
data sales;
input @1 Region $char8. @10 Repid 4. @15 Amount 10. ;
format Amount dollar12.;
cards;
NORTH 1001 1000000
NORTH 1002 1100000
NORTH 1003 1550000
NORTH 1008 1250000
NORTH 1005 900000
SOUTH 1007 2105000
SOUTH 1010 875000
SOUTH 1012 1655000
EAST 1051 2508000
EAST 1055 1805000
;
run;
proc sort data=sales;
by region;
run;
proc means data=sales noprint nway;
by region;
var amount;
output out=regtot(keep=regtotal region) sum=regtotal;
run;
data percent1;
merge sales regtot;
by region;
regpct=(amount/regtotal)*100;
format regpct 6.2 amount regtotal dollar10.;
run;
proc print data=percent1 noobs;
run;
proc tabulate
proc tabulate data=sales out=percent2;
class region repid;
var amount;
table region*repid,amount*(sum*f=dollar10. pctsum<repid>);
run;
proc report
proc report data=sales nowd out=percent3;
column region repid amount regpct;
define region / order;
define repid / display;
define amount / sum format=dollar10.;
define regpct / computed format=percent8.2;
compute before region;
hold=amount.sum;
endcomp;
compute regpct;
regpct=amount.sum/hold;
endcomp;
run;
5.CREATING A CUSTOM REPORT
DATA STEP
proc sort data=sashelp.class out=sorted;
by sex;
run;
data _null_;
set sorted;
by sex;
file print header=h notitles;
if first.sex thne put _page_;
put name 1-8 age 13-15 @20 sex +5 weight 5.1 +5 height;
return;
H:
put @35 "Page " n" of 2" //;
put @1 "Name" @13 "Age" @20 "Sex" @26 "Weight" @ 36 "Height";
put @1 "----" @13 "---" @20 "---" @26 "------" @ 36 "------";
return;
run;
PROC REPORT
proc report data=sorted nowd;
column sex name age sex=sex1 weight height;
define sex / order noprint;
define name / order 'Name/--';
define age / order 'Age/--' width=4;
define sex1 / order 'Sex/--' width=3;
define weight / display 'Weight/--' width=7;
define height / display 'Height/--' width=7;
break after sex / page;
run;
还有很多类似的情况...........................................................................