gzjb 发表于 2010-2-26 03:59 
/**************************************************************************************************
**** Here Just show a complicated way to implement it. If anyone knows a simple way *****
*** Please let me know. Thanks a lot **********************************/;
*********************** SAS Code **********************;
DATA test;
input Week $ Day Price;
CARDS;
111 1 1
111 1 2
112 1 3
112 1 4
111 2 5
111 2 6
112 2 7
112 2 8
;
proc sort data=test;
by day week;
run;
proc means data=test;
by Day Week;
var price;
output out=meanout(keep= Week Day priceMean) MEAN(price)=priceMean;
run;
data _NULL_;
set meanout;
File 'C:\ProjStudy\gzjb\interchange.txt';
put Day Week PriceMean;
run;
data meanP;
infile 'C:\ProjStudy\gzjb\interchange.txt';
input Day Week1$ PriceMean1@;
input Day Week2$ PriceMean2;
run;
data meanP1 (drop=tmPrice);
set meanP;
tmPrice=PriceMean1;
PriceMean1=PriceMean2;
PriceMean2=tmPrice;
run;
data meanPweek1(keep=Day Week1 PriceMean1)
meanPweek2(keep=Day Week2 PriceMean2);
set MeanP1;
run;
data mergePweek;
merge meanPweek1(rename=( Week1=Week PriceMean1=MeanP)) meanPweek2(rename=( Week2=Week PriceMean2=MeanP));
by Day Week;
run;
data lastData;
merge test mergePweek;
by Day Week;
run;
proc print noobs; run;
******************************************
SAS Output:
****************************************
Week Day Price MeanP
111 1 1 3.5
111 1 2 3.5
112 1 3 1.5
112 1 4 1.5
111 2 5 7.5
111 2 6 7.5
112 2 7 5.5
112 2 8 5.5
It can be much simplified as,
DATA test;
input Week $ Day Price;
CARDS;
111 1 1
111 1 2
112 1 3
112 1 4
111 2 5
111 2 6
112 2 7
112 2 8
;
proc sql;
select *, mean(price) as avgprice
from test
group by 1,2
order by 2,1
;
quit;