楼主: windvally
6037 24

[有偿编程] 一个统计和分类GPA成绩的SAS题,比较急 [推广有奖]

  • 0关注
  • 0粉丝

高中生

0%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
95 点
帖子
18
精华
0
在线时间
18 小时
注册时间
2014-4-21
最后登录
2014-4-29

10论坛币
本人是这个学期刚刚接触SAS,对这道题一直无法搞清楚。第一次到这个论坛上,希望高手们能帮一帮我把这个程序编出来。
题是英文题,如有人愿意帮忙但需要中文的话,请回复告知我,我会把题翻成中文。

题:
程序是用来统计和分类这个格式的数据:
K2EMN@591@MANEC 300 @3.0@B @
K2EMN@591@MATH  113 @4.0@C @
K2EMN@591@STAT  322 @1.0@P @
K2EMN@591@STAT  334 @3.0@A-@
K2EMN@591@STAT  336 @3.0@B @
MPCGK@591@ECON  110 @3.0@C+@
MPCGK@591@STAT  321 @3.0@B+@
MPCGK@591@STAT  322 @1.0@P @
MPCGK@591@STAT  361 @3.0@C+@
MPCGK@591@STAT  520 @3.0@C-@
NPMCS@591@COMMS 101 @2.0@A-@
NPMCS@591@COMMS 201 @2.0@B+@
NPMCS@591@COMMS 255 @3.0@A-@
NPMCS@591@PHY S 100 @3.0@B-@
NPMCS@591@PL SC 110 @3.0@B+@
NPMCS@591@REL A 301 @2.0@A-@
P2I8P@591@A HTG 100 @3.0@B @
学生号@学期号@课程名字@课程所值学分@该学生此课的字母成绩@学生姓名(有的数据文档有学生姓名,有的没有)

这些数据是以txt形式储存起来的文档,共有56个。要求是程序通过MACRO,只需要载入不同文件名,就可以把56个文档里的资料逐个统计分类。

制作4个HTML格式的报告:
报告1
       按学期号分类后:
       再按学生号分类:
              计算并输出每个学生该学期的平均GPA成绩(比如说最后一个学生NPMCS,他在591学期的平均GPA是3.5)
              GPA的换算方法是把字母成绩换成数字:带A的都是4,带B的3,C是2,D是1,E是0,其他字母全部忽略不记。

              计算并输出每个学生该学期获得的总学分(比如说最后一个学生NPMCS,他在591学期的学分是15)
              计算并输出每个学生该学期获得的总学分(真),但是如果课程没有得到ABCD的成绩,就不计入总学分。

              根据每个学生的总学分,如果小于等于26,标注该学生为1年级(F)
               根据每个学生的总学分,如果大于等于27小于等于56,标注该学生为2年级(S)
               根据每个学生的总学分,如果大于等于57小于等于86,标注该学生为3年级(J)
               根据每个学生的总学分,如果大于等于87,标注该学生为4年级(Sn)
              计算并输出每个学生该学期上了多少课。(NPMCS在591学期上了6课)

              计算并输出该学期每一个学生有多少个课的字母成绩是A
              计算并输出该学期每一个学生有多少个课的字母成绩是B
              计算并输出该学期每一个学生有多少个课的字母成绩是C
               计算并输出该学期每一个学生有多少个课的字母成绩是D
               计算并输出该学期每一个学生有多少个课的字母成绩显示的是W
               计算并输出该学期每一个学生有多少个课的字母成绩显示的是E,UW,WE,或IE
              根据课程名字,计算并输出每个学生是否有在同一个学期上两次以上相同的课。重课了多少次?
              
报告2
       按学期号分类后:
                计算并输出该学期所有学生的总平均GPA成绩
              GPA的换算方法是把字母成绩换成数字:带A的都是4,带B的3,C是2,D是1,E是0,其他字母全部忽略不记

              计算并输出该学期所有学生获得的总平均学分
              计算并输出该学期所有学生获得的总学分(真)(如果课程没有得到ABCD的成绩,就不计入总学分)

              计算并输出该学期一共有多少个课的字母成绩是A(不用按学生号分类)
              计算并输出该学期一共有多少个课的字母成绩是B(不用按学生号分类)
              计算并输出该学期一共有多少个课的字母成绩是C(不用按学生号分类)
               计算并输出该学期一共有多少个课的字母成绩是D(不用按学生号分类)
               计算并输出该学期一共有多少个课的字母成绩显示的是W(不用按学生号分类)
               计算并输出该学期一共有多少个课的字母成绩显示的是E,UW,WE,或IE(不用按学生号分类)

             重复以上内容,不过只计算课程缩写是STAT和MATH的数据(就是只统计统计学和数学课程的数据)

REPORT 3

   根据报告1中每个学生的平均GPA成绩,列出成绩名列前10%的学生的名字(学生号)
  比如说,举例的数据组中共有4个学生,那么该数据组的报告3就列出该4人中平均GPA成绩最高的那个人(NPMCS)
  计算10%是多少人时,小于1则取1.

   根据报告1中每个学生的所有学期算下来的总学分,计算并输出有多少个学生的学分在60-130之间。

REPORT 4
   根据报告1中每个学生的平均GPA成绩,列出成绩名列前10%的学生的名字(学生号)
  根据报告1中每个学生的所有学期算下来的总学分,计算并列出有多少学生学习了至少20个学分的统计学课(课程缩写:STAT)或数学课(课程缩写:MATH)


最好有:
   1.  运用MACRO减少重复的程序组
   2.  运用PROC SQL
   3.  运用 PROC REPORT
   4.  运用ODS去创建网页形式的报告
   5.  用Array去简化程序

编的程序最后运行的话,打出来的是4个report。
如有问题,敬请提问。非常感谢愿意帮助我的人。
因为刚到这个论坛,没有多少币,只能全押上了>.<

GPA Grade Data.zip

64.67 KB

本附件包括:

  • 190.txt
  • 191.txt
  • 192.txt
  • 276.txt
  • 283.txt
  • 284.txt
  • 285.txt
  • 286.txt
  • 287.txt
  • 288.txt
  • 289.txt
  • 290.txt
  • 291.txt
  • 292.txt
  • 378.txt
  • 383.txt
  • 384.txt
  • 385.txt
  • 386.txt
  • 387.txt
  • 388.txt
  • 389.txt
  • 390.txt
  • 391.txt
  • 392.txt
  • 574.txt
  • 575.txt
  • 576.txt
  • 577.txt
  • 578.txt
  • 579.txt
  • 581.txt
  • 582.txt
  • 583.txt
  • 584.txt
  • 585.txt
  • 586.txt
  • 587.txt
  • 588.txt
  • 589.txt
  • 590.txt
  • 591.txt
  • 592.txt
  • 175.txt
  • 176.txt
  • 177.txt
  • 179.txt
  • 180.txt
  • 182.txt
  • 183.txt
  • 184.txt
  • 185.txt
  • 186.txt
  • 187.txt
  • 188.txt
  • 189.txt

最佳答案

mingfeng07 查看完整内容

只输出了report1,后面基本上可以按照类似的编程可以做出来。另外report1中关于不用按学生号分类来求每个学生的字母成绩的重复率这一部分不太理解,一般如果计算每个学生的话都会按照每个学生的代号来首先分类然后再求解,所以这段我忽略了。
关键词:GPA 统计和 proc report proc sql Report 英文 中文 统计 程序
沙发
mingfeng07 学生认证  发表于 2014-4-21 05:20:11 |只看作者 |坛友微信交流群
只输出了report1,后面基本上可以按照类似的编程可以做出来。另外report1中关于不用按学生号分类来求每个学生的字母成绩的重复率这一部分不太理解,一般如果计算每个学生的话都会按照每个学生的代号来首先分类然后再求解,所以这段我忽略了。
  1. /*将txt文档导入数据集*/
  2. %macro test;
  3. %do i=1 %to 56;
  4. data a&i;
  5. infile  'C:\Users\Administrator\Desktop\a&i..txt' delimiter='@ ';
  6. input stud $ semester abb_course $5. id_course score GPA $;
  7. cards;
  8. run;
  9. %end;
  10. %mend;

  11. %test;

  12. /*数据集合并*/
  13. data base;
  14. set a1-a56;
  15. run;

  16. data base;
  17. set base;
  18. if substr(GPA,1,1)='A' then new_GPA=4;
  19. else if substr(GPA,1,1)='B' then new_GPA=3;
  20. else if substr(GPA,1,1)='C' then new_GPA=2;
  21. else if substr(GPA,1,1)='D' then new_GPA=1;
  22. else if substr(GPA,1,1)='E' then new_GPA=0;
  23. run;
  24. proc sql;
  25. create table base1 as select semester,stud,mean(new_GPA) as mean_GPA,sum(score) as sum_score,count(*) as num_course from base group by semester,stud;
  26. quit;
  27. proc sql;
  28. create table base2 as select semester,stud,sum(score) as real_sum_score from (select * from base where new_GPA>0 ) group by semester,stud;
  29. quit;
  30. proc sql;
  31. create table base3 as select base1.semester,base1.stud,mean_GPA,sum_score,real_sum_score,num_course from base1 join base2 on base1.semester=base2.semester and base1.stud=base2.stud;
  32. quit;
  33. data base4;
  34. set base3;
  35. if sum_score<=26 then grade_stud=1;
  36. else if 27=<sum_score<=56 then grade_stud=2;
  37. else if 57=<sum_score<=86 then grade_stud=3;
  38. else if 87=<sum_score then grade_stud=4;
  39. run;
  40. proc sql;
  41. create table base5 as select semester,stud,abb_course,count(*) as repeat_num from base where calculated repeat_num>1;
  42. quit;

  43. /*ods输出*/
  44. ods listing close;
  45. ods html file='C:\Users\Administrator\Desktop\htm.htm';
  46. proc print data=base4;
  47. proc print data=base5;
  48. run;
  49. ods listing;
复制代码
欢迎扫一扫我头像关注, 不定期分享SAS技术知识。

使用道具

藤椅
windvally 发表于 2014-4-21 09:31:31 |只看作者 |坛友微信交流群
有人愿意帮忙吗?怎么用Macro,Proc format和loop来完成成绩的分类统计呢?

使用道具

板凳
mingfeng07 学生认证  发表于 2014-4-21 09:39:58 |只看作者 |坛友微信交流群
你把四个报告的内容,用中文阐述一下吧,看不太明白。
欢迎扫一扫我头像关注, 不定期分享SAS技术知识。

使用道具

报纸
windvally 发表于 2014-4-21 10:40:30 |只看作者 |坛友微信交流群
已经全部翻译成中文,谢谢!

使用道具

地板
learsaas 发表于 2014-4-21 12:57:47 |只看作者 |坛友微信交流群
这题目貌似有很多问题:
1、字母成绩的值有哪几种,需要完全告知大家。
2、居然要你统计每个学期每个学生重复课有几次,那么也就是说你的数据源头中可能有某个学期一个学生上同一门课n多次,那么相应也可能有n多次的成绩,那么统计总分的时候是仅统计n次中的某次,还是把n次的成绩全部相加

以上是我看了你报告1的题目,所提出的疑问,后面的报告2-4还没看。

使用道具

7
learsaas 发表于 2014-4-21 13:02:33 |只看作者 |坛友微信交流群
报告2貌似也有相同问题,而且又新增疑问:
计算并输出该学期一共有多少个课的字母成绩是A(不用按学生号分类)
一个课程可能存在一个同学成绩A,一个同学成绩B,。。。。。。。
这个情况到底是统计在A内,还是B内,还是各统计一次。

使用道具

8
learsaas 发表于 2014-4-21 13:06:03 |只看作者 |坛友微信交流群
针对出题人提出的最好有:
   1.  运用MACRO减少重复的程序组
   2.  运用PROC SQL
   3.  运用 PROC REPORT
   4.  运用ODS去创建网页形式的报告
   5.  用Array去简化程序
我觉得按照这5点出来的程序不是较优秀的程序。尤其是第二点会让你增加很多代码量而且效率未必高。呵呵,个人观点仅供参考。

使用道具

9
learsaas 发表于 2014-4-21 13:06:40 |只看作者 |坛友微信交流群
针对出题人提出的最好有:
   1.  运用MACRO减少重复的程序组
   2.  运用PROC SQL
   3.  运用 PROC REPORT
   4.  运用ODS去创建网页形式的报告
   5.  用Array去简化程序
我觉得按照这5点出来的程序不是较优秀的程序。尤其是第二点会让你增加很多代码量而且效率未必高。呵呵,个人观点仅供参考。

使用道具

10
windvally 发表于 2014-4-21 13:16:07 |只看作者 |坛友微信交流群
learsaas 发表于 2014-4-21 13:06
针对出题人提出的最好有:
   1.  运用MACRO减少重复的程序组
   2.  运用PROC SQL
呵呵,谢谢你的建议,不过我也没法让那出题的人改题 >.<///

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 07:45