data student;
do grade=1 to 5;
do class=1 to 6;
n=int(30+100*ranuni(1));
do i=1 to n;
name=put(grade,z2.)||'-'||put(class,z2.)||'-'||left(n);
english=int(50+50*ranuni(2));
score=int(100+100*ranuni(3));
nn=int(n/10);
output;
end;
end;
end;
run;
proc sort data=student;
by grade class english;
run;
data student;
retain group cnt;
set student;
by grade class english;
if first.class then do;
group=1;
cnt=1;
end;
else cnt=cnt+1;
output;
if cnt=nn then do;
group=group+1;
if group ne 10 then cnt=0;
else cnt=-99;
end;
run;
proc means data=student mean noprint;
by grade class group;
weight english;
var score;
output out=mm mean=mean;
run;
data a(drop=_type_ _freq_ mean group);
retain m1 m2 m3 m4 m5 m6 m7 m8 m9 m10;
set mm;
by grade class group;
if first.class then do;
m1=.; m2=.; m3=.; m4=.; m5=.;
m6=.; m7=.; m8=.; m9=.; m10=.;
end;
select(group);
when(1) m1=mean;
when(2) m2=mean;
when(3) m3=mean;
when(4) m4=mean;
when(5) m5=mean;
when(6) m6=mean;
when(7) m7=mean;
when(8 ) m8=mean;
when(9) m9=mean;
when(10) m10=mean;
otherwise;
end;
if last.class then output;
run;作者: shiyiming 时间: 2006-3-31 12:09 标题: to xic 你好,非常感谢你的答案。同时,我想说明的是,数据集中本来就只有name,grade,class,english,score 这几项,其他的并没有,也就是说,编程关键在于把每个班的人数算出来并调用。而不是一开始就有每个班人数的。作者: shiyiming 时间: 2006-3-31 14:59 标题: to xic 你好,xic。对于你的程序最后有一个地方不是很明白,即
if last.class then output;
这一句起了好大的作用。我试过,如果去掉这一句,整个答案都不同,而且是错误的。我想问一下,这一句具体的意义是什么呢?为什么可以得到正确的答案。我自己编的程序是算到最后时用transpose的,我觉得你的编得更好,但是就是不太明白以上那一句的意思。可以解释一下吗?作者: shiyiming 时间: 2006-4-3 13:29 标题: 真的还有富余吗? 为了体现这题目还有富余,我再努了努力.
几点说明
1.english应该是降序,但为了和XIC的结果进行比较,我也就没有加decs,你可以自己加.
2.如果严格的讲的话,XIC老兄的程序在生成测试数据集时保留了nn来做为后面程序使用的一个信息.这个过程有一点点取巧,如果原始数据没有这个变量的话,只有再加一段处理来生成它,后面的程序才能正确执行.不信大家把student数据集中的nn drop掉,看看会发生什么事.
3.最近几个论坛有意思的题目不多.希望大家能多找点有意思的题来玩玩.
[code:c4e97]proc sort data=student; /*用student数据集就可,可drop n nn*/
by grade class english;
run;
proc sql;
create table temp as /*中间数据集,*/
select grade,class,english,min(ceil((monotonic()-min(monotonic())+1)/(floor(count(*)/10))),10) as group,score
from student
group by grade, class
order by monotonic()
;
create table final as /*final是最后的结果集,等同于xic的结果数据集A*/
select grade,class %var(10)
from temp
group by grade,class
;
quit;[/code:c4e97]