学习SAS语言一章,用数据步建立数据集,注意不同类型变量的表示、复制数据集、合并、拆分数据集等操作;用过程步,按指定的要求和格式输出数据。
本次作业需完成并提交3个SAS程序:
1)grade01.sas
2)classBMI02.sas
3)stu_merge03.sas
1.( 30分 )
10名幼儿园小朋友的名字、性别、生日信息,见附件表1。新建一个名为Child数据集,数据集中有四个变量,分别是name,gender,birthday,age,其中变量age是用赋值语句计算出来的每个小朋友的年龄,程序命名为grade01.sas。
关键是计算年龄:
i. 使用函数:intck()——计算,date()——当前日期
ii. 变量age是运算得到,可以不用input进行定义,直接使用
iii. yyddmm10. 与 yyddmms10. 的区别:前者间隔符为短横线,后者为斜线
data c1;
input name$ gender$ birthday yymmdd10.;
cards;
刘明铭 男 2012/11/11
李敏洁 女 2014/3/15
代子清 男 2014/9/20
夏天 男 2013/4/1
郭悦 女 2013/7/25
胡月玲 女 2013/7/20
程彬 女 2014/10/9
杨帆帆 男 2016/10/9
刘进 男 2016/5/10
张思凡 女 2015/8/19
;
run;
DATA Child;
set C1;
b=date();
age=intck('year',birthday,b);
drop b;
run;
proc print;
FORMAT birthday yymmdds10.;
title 'Child';
RUN;
2
( 30分 )
针对SASHELP.CLASS数据集,按如下要求编写程序:
1)复制SASHELP.CLASS数据集,建立新变量BMI,其值为weight/(height*height)*1000,新数据集命名为BMIclass;
2)用proc print过程输出数据集BMIclass中NAME,SEX, AGE,BMI四个变量的观测值,其中,BMI值用FORMAT过程定义输出格式,使得变量BMI输出形式为:
BMI值<18.5 ,输出显示“偏瘦”;
18.5=<BMI值<23.9,输出显示“正常”
BMI值>=23.9,输出显示“偏胖”
3)将数据集BMIclass按性别拆分为二个名为boy、girl的新数据集,新数据集中不需有性别变量,且BMI值的输出格式为6.2,即输出显示到小数点后2位。
程序命名为classBMI02.sas
OK,修改好了,下面的这个是正确的。
i. Proc format的使用,注意细节!!!
proc format; 这里有一个分号
value的这一部分,只有一个分号,有两个 ‘ < ’
ii. Data步里面format的使用
format bmi b.; 请不要忘了,这里的b右下角有个点 -_-
data BMIclass;
set sashelp.class;
BMI=weight/(height*height)*1000;
keep name sex age bmi;
run;
proc format;
value b low-<18.5='偏瘦'
18.5-<23.9='正常'
23.9-high='偏胖';
run;
proc print data=bmiclass;
format bmi b.;
title 'BMIclass';
run;
data boy girl;
set BMIclass;
if sex='女' then output girl;
else output boy;
drop sex;
format bmi 6.2;
run;
proc print
data=boy;
title 'boy';
run;
proc print
data=girl;
title 'girl';
run;
3
( 40分 )
用程序stu_merge03.sas实现:
1)参见附件,创建数据集stu_info和stu_score,且合并生成新数据集student.
2) 输出显示数据集student中的id,subject,score,class列,并分别以标签”学号”,”科目”,”分数"和”班级"显示。
有几个写的时候注意的点:
i. 导入的数据,可以先在excel里面敲,然后复制-粘贴过来,注意不要改动间隔,它们之间是制表符【Tab】,SAS可以识别
ii. 使用merge不要忘记了,by语句
iii. 命名标签的时候,在DATA步里使用label语句就可以直接定义变量标签,注意,定义多个变量的标签,一个label就够了!!分号也只用一个!!
iiii. 最后,输出的结果变量显示为标签,只需在Proc print语句的,数据集名后,加上label
data stu_info;
input id sex$ age class$;
cards;
1 boy 14 A
2 girl 15 A
3 girl 15 A
4 boy 16 B
5 boy 15 B
6 girl 15 B
;
RUN;
data stu_score;
input id subject$ score;
cards;
1 chinese 89
1 math 79
2 chinese 67
2 math 84
3 chinese 78
3 math 83
4 chinese 69
4 math 85
5 chinese 79
5 math 69
;
run;
data student;
merge stu_info stu_score;
by id;
label id='学号'
subject='科目'
score='分数'
class='班级';
drop sex age;
run;
title 'student';
proc print
data=student label;
run;