sas test--求每个班级各个科目的最高分
(2009-09-22 21:35:23)
标签:
杂谈 |
分类: SAS |
已知:数据集score记录的是每个班级各个科目(语文、数学)的三个最高分
要求:生成数据集result(按班级横向排列各个科目的三个高分成绩)
data score;
result
class chinese1 chinese2 chinese3 maths1 maths2 maths3
1 100 97 95 98 95 93
2 98 94 90 89 88 87
3 100 90 89 89 86 83
法一:
data result;
retain class;
do i=1 to 3;
array c(3) chinese1-chinese3;
array m(3) maths1-maths3;
set score ;
c(i)=chinese;
m(i)=maths;
end;
drop i chinese maths rank ;
run;
法 二:
***
%macro transpose(indate,i,n,class);
%do m=1 %to &n;
proc transpose data=&indate out=score%scan(&i,&m)(drop=_name_) prefix=%scan(&i,&m);
by &class;
var %scan(&i,&m);
run;
%end;
data result;
merge
%do j=1 %to &n;
score%scan(&i,&j)
%end;;
by &class;
run;
%mend ;
%transpose(score,chinese maths,2,class);
法三:
merge macro
*************************indate输入数据集;
************************v 需转置的变量中间用空格隔开;
***********************n 需转置的变量个数;
***********************class 分组变量;
**********************r 每组里的不同次数;
%macro merge (indate,v,n,class,r);
proc sql noprint;
select count(distinct &r) into :rank from &indate;
quit;
data result;
merge
%do i=1 %to &rank;
score(rename=(%do j=1
%to &n ;
%scan(&v,&j)=%scan(&v,&j)&i.
%end;
%end;;
by &class;
drop &r;
run;
data result;
retain class %do i=1
%to &n; %do j=1 %to
&rank;
set result;
run;
%mend;
%merge(score,chinese maths,2,class,rank);
法四:
%macro arr(indate,v,n,r,class);
data result;
retain &class;
%do i=1 %to &n;
array c&i(&r)
%do j=1 %to &r;
%scan(&v,&i)&j %end ;;%end;
do k=1 to 3;
set &indate;
%do m=1 %to &n;
c&m.(k)=%scan(&v,&m.);%end;
end;
keep &class
%do i=1 %to &n; %do j=1 %to
&r;
run;
%mend;
%arr(score,chinese maths,2 ,3,class);
法五:
proc sort data=score;by class rank;run;
proc transpose data=score out=a;
by class;
var chinese maths;
run;
data chinese(drop=_NAME_) ;
set a(where=(_NAME_='chinese') rename=(COL1=chinese1 COL2=chinese2 COL3=chinese3 ));
run;
data maths(drop=_NAME_) ;
set a(where=(_NAME_='maths') rename=(COL1=maths1 COL2=maths2 COL3=maths3 ));
run;
data all;
merge
by class;
if a or b;
run;
法六:
proc transpose data=score out=score2 prefix=chinese;
run;
proc transpose data=score out=score3 prefix=maths;
run;
data score4(drop=_name_);
run;
法七:
proc transpose data=score out=result;
run;
proc transpose data=result out=result2(rename=(_name_=name));
run;
proc transpose data=result2 out=result(drop=_name_ rename=(col1-col3=chinese1-chinese3 col4-col6=maths1-maths3));
run;