楼主: Dylan890328
3050 5

[问答] SAS计算GPA基础题悬赏1,150金币! [推广有奖]

  • 0关注
  • 0粉丝

硕士生

36%

还不是VIP/贵宾

-

威望
0
论坛币
2 个
通用积分
0
学术水平
3 点
热心指数
0 点
信用等级
0 点
经验
931 点
帖子
76
精华
0
在线时间
184 小时
注册时间
2010-9-15
最后登录
2022-6-22

楼主
Dylan890328 发表于 2010-12-12 15:42:45 |AI写论文
150论坛币
Report 1:

制作一个report, 按照学生的ID Semester(学期,从早到晚)排列,report内容里包括:
1.
GPA (每个学生每学期的绩点成绩)
2.
Cumulative GPA (每个学生按学期逐渐累计的绩点成绩)
3.
Credit Hours Earned (每个学生每学期学分数量)
4.
Designation of Class Standing (每个学生每学期课程数量)

原始数据解释:原始数据形如:
  1. FQ7JO@175@ENGL 111 @3.0@B-@
复制代码

学生ID: FQ7JO (即第一个@前面的)
Semester 代号: 175 (即第一个@和第二个@之间的东西)
课程代号:ENGL 111
(即第二个@和第三个@之间的东西,好像没有用)
该课的学分: 3.0 (即第三个@和第四个@之间的东西)
该课的成绩:B- (即第四个@和第五个@之间的东西)
GPA计算方式 A: 4.0
A-: 3.7
B+: 3.4
B: 3.0
B-: 2.7
C+ 2.4
C: 2.0
C-:1.7
D+:1.4
D:1.0
D-:0.7
E,UW, IE, WE0.0
其他的成绩如W, P, I, NS, T 都不算在GPA里。
GPA的算法例子:加权平均, 比如一个学生选了四门课,第一门课4个学分,得了A, 第二门3个学分得了B,第三门2个学分得了UW, 第四门课1个学分得了P那这个学生的GPA是:4.0*4+3.0*3+0.0*2/ (4+3+2) = 2.78第四门课没有计算因为P不算GPA.

要求:
1. By ID, Semester with a page break betweenID’s. (SAS报告里面每个学生之间用分页符隔开)
2. Report 里面每个变量都要labeled.
3. 运用PROC SQL 进行queries subsettingdata
4. 运用MACRO 减少重复的code.
5. 运用 PROC REPORT 来做所有的报告
6. 运用ODS 制作网页
7. 运用ARRAYS 简化代码
关键词:50金币 基础题 GPA designation proc report 基础 SAS 金币 悬赏 GPA

本帖被以下文库推荐

沙发
hopewell 发表于 2010-12-12 15:42:46
  1. filename gap_txt 'd:\Students Grades.txt';
  2. data fmt(drop=i temp);
  3.     missing X;
  4.     length start $2;
  5.     infile datalines dlm=':';
  6.     input temp :$20. label;
  7.     fmtname='score';
  8.     type='i';
  9.     do i=1 to count(temp,',')+1;
  10.         start=strip(scan(temp,i,','));
  11.         output;
  12.     end;
  13. datalines;
  14. A: 4.0
  15. A-: 3.7
  16. B+: 3.4
  17. B: 3.0
  18. B-: 2.7
  19. C+: 2.4
  20. C: 2.0
  21. C-:1.7
  22. D+:1.4
  23. D:1.0
  24. D-:0.7
  25. E,UW, IE, WE:0.0
  26. W, P, I, NS, T: X
  27. ;
  28. proc format cntlin=fmt; run;
  29. data raw;
  30.     infile gap_txt dlm='@';
  31.     input Student_Id :$10. Semester Course :$10. Credit Score :score.;
  32. run;
  33. proc sql;
  34.     create table report1 as
  35.         select student_id, semester,
  36.                round(sum(credit*score)/sum(credit),.01) as GPA,
  37.                sum(credit) as Credit_Hours_Earned,
  38.                count(credit) as Designation_Class_Standing
  39.             from raw
  40.             where score not is null
  41.             group by student_id, semester;
  42. quit;
  43. ods _all_ close;
  44. ods html body='d:\report1.html';
  45. title;
  46. proc report data=report1 nowd;
  47.     by student_id;
  48.     column student_id semester gpa cumulative_gpa credit_hours_earned designation_class_standing;
  49.     define student_id /order 'Student';
  50.     define semester /display;
  51.     define gpa /display format=8.2;
  52.     define credit_hours_earned /display format=8.1 'Credit Hours/Earned';
  53.     define designation_class_standing /display 'Designation of/Class Standing';
  54.     define Cumulative_GPA /computed format=8.2 'Cumulative/GPA';
  55.     compute before student_id;
  56.         temp=0;
  57.     endcomp;
  58.     compute cumulative_gpa;
  59.         temp+gpa;
  60.         cumulative_gpa=temp;
  61.     endcomp;
  62.     break after student_id / page;
  63. quit;
  64. ods _all_ close;
  65. ods listing;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
Dylan890328 + 1 + 1 您在算cumulative GPA的时候没有进行加权平均,而是直接相加。例如一个

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

观钓颇逾垂钓趣 种花何问看花谁

藤椅
xiansonghe 发表于 2010-12-12 20:20:24
/*建立逻辑库gpa*/
libname gpa 'f:\gpa';/*读入数据,建立数据集*/
data gpa.gpa;
    infile 'f:\gpa\gpa.txt';
    input ID$ 1-5 Semester 7-9 Course$ 11-20 credits 22-24 scores$ 26-27;
    label ID='学生ID'
          Semester='学期代号'
          Course='课程代号'
          credits='学分'
          scores='成绩';
run;

/*计算GPA*/
data gpa.gpa;
    set gpa.gpa;
    select(scores);
        when('A') gpa=4.0;
        when('A-') gpa=3.7;
        when('B+') gpa=3.4;
        when('B') gpa=3.0;
        when('B-') gpa=2.7;
        when('C+') gpa=2.4;
        when('C') gpa=2.0;
        when('C-') gpa=1.7;
        when('D+') gpa=1.4;
        when('D') gpa=1.0;
        when('D-') gpa=0.7;
        otherwise gpa=0;
    end;
run;


/*计算每学期GPA, 每学期学分数量,课程数量*/
proc sql;
    create table gpa.sgpa as
    (select distinct ID,semester,sum(credits*gpa) as sgpa,sum(credits) as credits label=’每学期学分数量’,count(course) as counum label=’每学期学课程数’
        from gpa.gpa
        group by id,semester);


/*计算累计的绩点成绩*/
data gpa.sgpa;
    retain _numeric_ _character_ cgpa 0;
    label cgpa='按学期逐渐累计的绩点成绩';
    set gpa.sgpa;
    by ID semester;
    if first.ID then cgpa=0;
    cgpa=cgpa+sgpa;
run;

/*report, 按照学生的ID和 Semester*/
proc report data=gpa.sgpa;
run;
已有 1 人评分学术水平 热心指数 收起 理由
Dylan890328 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

板凳
baoaibaobao 发表于 2010-12-12 20:23:43
楼主,你的要求还真多,先没考虑宏和数组,代码如下:
  1. data a(drop=a);  /*读入数据集*/
  2. infile 'E:\aa.txt' dsd dlm='@';
  3. input id$ Semester num$ score pd$ a$;run;
  4. data b;  /*将等级转化为积分,同时计算每人每学期每门课的GPA(gpasum)*/
  5.    set a;
  6.       format gpa 4.2;
  7.       select(pd);
  8.       when('A') gpa=4.0;
  9.       when('A-') gpa=3.7;
  10.       when('B+') gpa=3.4;
  11.       when('B') gpa=3.0;
  12.       when('B-') gpa=2.7;
  13.       when('C+') gpa=2.4;
  14.       when('C') gpa=2.0;
  15.       when('C-') gpa=1.7;
  16.       when('D+') gpa=1.4;
  17.       when('D') gpa=1.0;
  18.       when('D-') gpa=0.7;
  19.       when ('E','UW','IE','WE') gpa=0.0;
  20.       otherwise gpa=.;
  21.    end;
  22.    gpasum=gpa*score;
  23. run;
  24. proc sort data=b;by id semester;run;
  25. proc sql; /*计算得到每人每学期的课程数量(count)、每人每学期学分数量(sc)、每人每学期的绩点成绩(su)*/
  26. create table gpa as
  27. select id,semester,count(semester) as count,sum(gpasum) as su,sum(score) as sc
  28. from b group by id,semester;
  29. quit;
  30. data gpa; /*删除W, P, I, NS, T 等*/
  31. set gpa;
  32. if su^=.;
  33. run;
  34. proc sort data=gpa;by id;run;
  35. data gpa;  /*计算得到每人按照学期的绩点逐渐累计成绩(sum1)*/
  36.     set gpa;
  37.        by id ;
  38.        retain sum1;
  39.        if first.id then sum1=0;
  40.        sum1=sum1+su; output;
  41. run;
  42. ods listing close;
  43. ods html file="E:\学生学期成绩报表1.html" ;
  44. title '学生学期成绩报表';
  45. options nodate nonumber center ;
  46. proc report data=gpa split='*' nowd;         
  47.    column id semester su sum1 sc count;
  48.    define id/order=data '学生ID' order  style(column)=[just=center];
  49.    define semester/order=data '学期代号'   style(column)=[just=center];
  50.    define su/order=data '每人每学期*绩点成绩' style(column)=[just=center];
  51.    define sum1/order=data '每人按照学期*绩点累计成绩' style(column)=[just=center];
  52.    define sc/order=data '每人每学期*学分数量' style(column)=[just=center];
  53.    define count/order=data '每人每学期*课程数量' style(column)=[just=center];
  54.    compute after id;
  55.      line 60*'-';  
  56.    endcomp;
  57. run;
  58. ods html close;
  59. ods listing;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
Dylan890328 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

报纸
Dylan890328 发表于 2010-12-12 22:59:37
谢谢大家的热心帮助,再过几个小时我将会公布最佳答案。希望各位高手能够继续提供悬赏2,3,4的解答。我会立即充值,把悬赏2和3分别提高到300金币!

地板
jeozu 发表于 2010-12-13 09:04:57
  1. data gpa;
  2. infile "Z:\DATA\temp\Students Grades 2.txt" dlm="@" missover dsd;
  3. input ID$ 1-5 Semester 7-9 Course$ 11-20 credits 22-24 scores$ 26-27;
  4. run;
  5. data gpa;
  6.     set gpa;
  7.     select(scores);
  8.         when('A') gpa=4.0;
  9.         when('A-') gpa=3.7;
  10.         when('B+') gpa=3.4;
  11.         when('B') gpa=3.0;
  12.         when('B-') gpa=2.7;
  13.         when('C+') gpa=2.4;
  14.         when('C') gpa=2.0;
  15.         when('C-') gpa=1.7;
  16.         when('D+') gpa=1.4;
  17.         when('D') gpa=1.0;
  18.         when('D-') gpa=0.7;
  19.         when ('E','UW','IE','WE') gpa=0.0;        otherwise gpa=.;    end;
  20. run;
  21. proc sql noprint;
  22. create table tmp1 as
  23. select id
  24.      , semester
  25.      , sum(credits*gpa)/sum(credits) as GPA
  26. /*     , Cuml_GPA*/
  27.      , sum(case when gpa >0 then credits
  28.                 else 0
  29.            end)      as CrdHEarned
  30.      , count(course) as Desig
  31. from gpa
  32. group by ID, semester
  33. ;
  34. create table tmp2 as
  35. select a.id
  36.      , a.semester
  37.          , sum(b.credits*b.gpa)/sum(b.credits)  as Cuml_GPA
  38. from (select distinct
  39.              id
  40.            , semester
  41.          from gpa
  42.       ) a
  43.    , gpa b
  44. where a.id=b.id
  45.   and a.semester>=b.semester
  46. group by a.id, a.semester
  47. ;
  48. create table report1 as
  49. select a.id
  50.      , a.semester
  51.          , a.GPA
  52.          , b.Cuml_GPA
  53.          , CrdHEaRned
  54.          , Desig
  55. from tmp1 a
  56.    , tmp2 b
  57. where a.id=b.id
  58.   and a.semester=b.semester
  59. ;
  60. quit;
复制代码

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-28 19:37