现在的位置: 首页 > 综合 > 正文

Data步与Base模块程序

2018年10月23日 ⁄ 综合 ⁄ 共 3581字 ⁄ 字号 评论关闭

对同一个问题,论坛里面的大牛通常可以给出不同的解决方案。其中,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;

还有很多类似的情况...........................................................................

抱歉!评论已关闭.