加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

sas test--求每个班级各个科目的最高分

(2009-09-22 21:35:23)
标签:

杂谈

分类: SAS

已知:数据集score记录的是每个班级各个科目(语文、数学)的三个最高分
要求:生成数据集result(按班级横向排列各个科目的三个高分成绩)

data score;

        input class rank chinese maths;

        cards;

        1 1 100 98

        1 2 97 95

        1 3 95 93

        2 1 98 89

        2 2 94 88

        2 3 90 87

        3 1 100 89

        3 2 90 86

        3 3 89 83

        ;

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;

 

法 二:

***   tranpose macro

%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;   ) where=(&r=&i))

%end;;

by &class;

drop &r;

run;

data result;

retain class %do i=1 %to &n; %do j=1 %to &rank;  %scan(&v,&i)&j %end ;%end;;

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;  %scan(&v,&i)&j %end ;%end;;

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

        chinese (in=a)

        maths         (in=b)

        ;

by class;

if a or b;

run;

法六:

proc transpose data=score out=score2 prefix=chinese;

        var chinese ;

        by class;

run;

proc transpose data=score out=score3 prefix=maths;

        var maths;

        by class;

run;

data score4(drop=_name_);

        merge score2 score3;

run;

法七:

proc transpose data=score out=result;

        by class;

        var chinese maths ;

run;

proc transpose data=result out=result2(rename=(_name_=name));

        by class _name_;

        var col:;

run;

proc transpose data=result2 out=result(drop=_name_ rename=(col1-col3=chinese1-chinese3 col4-col6=maths1-maths3));

        by class;

        var col1 ;

run;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有