SAS中文论坛

标题: 请问一个应该是关于循环的问题 [打印本页]

作者: shiyiming    时间: 2005-3-10 16:16
标题: 请问一个应该是关于循环的问题
有这样的一个表:
成绩  人数
90     5
91     1
82     3
. . . . .
60     8
先算出成绩80分以上的人数,如果人数<10,找出前10名的最低成绩。
头晕了,请帮帮忙!
thx!!!
作者: shiyiming    时间: 2005-3-10 19:00
标题: to madog
[code:c1e15]data score;
input score num;
datalines;
90 5
60 8
82 3
91 1
65 9
77 4
;
run;

proc sort data=score;
by descending score;
run;

/*统计超过80分的总人数*/
proc sql;
select sum(num) as total_num from score where score>=80;
quit;

/*寻找第10名的分数*/
data _null_;
length cum_num 8 i 8;
retain cum_num 0 i 0;
set score;
cum_num=cum_num+num;
if cum_num>=10 and i=0 then do;
i=1;
put score=;
end;
run;[/code:c1e15]

注:
1、以上程序没有太过思考,比较直白,效率不算高,但是逻辑还是易于理解的。你有兴趣,自己更可以试试SAS统计方面的过程步来实现。
2、只要把最后一段程序中“10”改成“n”,就实现了寻找第n名的分数的功能。
作者: shiyiming    时间: 2005-3-10 20:22
标题: 如果这样呢?
真实感谢!很容易就看明白了。
假如改成以下这样呢?
首先找出分数在90以上的人数,如果人数少于10人,则依次减少分数,如:89、88.......,使该分数以上的人数不少于10人,最后列出分数和人数的分布情况。
谢谢!!!
作者: shiyiming    时间: 2005-3-11 10:45
标题: to madog
我的程序已经能够告诉你第10名的分数了,也就是说该分数以上的人数不少于10。根本不需要你想象的那么复杂,要做依次递减的循环。
如果你就是想做循环,那就用macro,但是我个人认为这个case没有意义。
[code:6e068]%macro score;
%do i=100 %to 0 %by -1;
proc sql noprint;
select sum(num) into :total_num from score where score>=&i;
quit;
%put score=&i;
%put count=&total_num;
%put;
%end;
%mend score;
%score;[/code:6e068]当然,还需要加%if判断等,自己完善吧,所有核心元素代码都已经有了。

关于频数,你的列出数据已经是频数表了。如果你的数据是name score,那么最好用proc freq来做。
作者: shiyiming    时间: 2005-3-11 16:32
标题:





欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2