LAB部分
1.lab考到给excel文件让你建立library:.
libname certxl xlsx 'c:\cert\input\input11.xlsx';. 1point3acres.com
然后问你sheet1的名字。一般来讲sheet A应该叫sheet A$,我本地练习的时候不管直接点进左侧library查看还是proc contents都是sheet A$。奇怪的地方在于考试当中那两个sheet的名字直接不带$符号,就是people和income。用它里面的某个变量算平均值也是直接PROC MEANS DATA=certxl.income;不知道怎么回事。还有就是本地练习的时候我的电脑只能写 libname certxl excel 'c:\cert\input\input11.xlsx'; 来识别xlsx,但考试的时候只有xlsx能正确读取。
2.那个最简单的lab题也考到了,就是问encoding和label,然后求了个什么值。. 1point 3acres
3.lab改错。遇到某几个重复的firstname就count+1。比如:
PROC SORT DATA=cert.input44 OUT=input44; (所有的原文件都只读不能修改)
BY firstname;
RUN;
. 1point3acres.com
DATA out;
SET input44;
BY firstname;
IF upcase(firstname) in ('TAO', 'CHEN', 'AMANDA', 'JAMES') THEN DO; (原题在in的条件里不打引号,且前面没有upcase变量,导致没有一个变量符合要求)
IF first.firstname THEN count=0;
count+1;-baidu 1point3acres
END;. 1point 3acres
ELSE IF upcase(firstname) not in ('TAO', 'CHEN', 'AMANDA', 'JAMES') THEN count=0; (不知道这里直接else count=0不要后面的可不可以)
然后问第361个obs的firstname是什么?第582个obs的count是什么?
4.lab改错。给几个条件split dataset。
DATA sofas chairs tables beds;
SET cert.input38;
IF product='SOFA' THEN OUTPUT sofas; (改错前条件里没有大写,和数据集不符,output后面没有跟目标数据集)
ELSE IF product='CHAIR' THEN OUTPUT chairs;
ELSE IF product='TABLE' THEN OUTPUT tables;
ELSE IF product='BED' THEN OUTPUT beds; (谨慎起见我都会加if...then...,不知道这里只else行不行)
RUN;
然后问你sofas和chairs里面有几个obs?beds里第42个obs的price是多少?
5.lab给一个数据集,按照特定方式排序,并保留相同var1里面var2值最高的那个。记得用first./last.前先排序,否则会报错。
PROC SORT DATA=cert.input13 OUT=input13;
BY descending postal_code income; (邮编降序,收入升序。descending只管后面一个。)
RUN;. ----
DATA results.output13;
SET input13;
BY descending postal_code income;
IF last.income; (同一邮编,升序排在末尾即数值最大).google и
RUN;
然后问了第64个obs的ID是多少?第52个obs的age是多少?(总之是某个别的变量)
6. lab给数据集,empID的格式是CABnnnnn,比如CAB12306,提取数字部分组成新的num变量numID,y=numID*5,求y在某个组的平均值。
DATA output21;
SET cert.input21;
numID=INPUT(substr(empID,4,5),5.);
y=numID*1.5;
RUN;
问y在比如department='clean'时的平均值。
7. 似乎和上述lab3一个题,firstname含有大小写z的zflag=1,否则zflag=0,求全部数据中zflag=0的数量。
DATA out2;
SET cert.input44;. ----
IF find(firstname,'z','i') ne 0 THEN zflag=1;
ELSE IF find(firstname,'z','i') = 0 THEN zflag=0;
RUN;. 1point 3acres
8.给一个数据集,叫你先drop smoking weight height等,再根据cholesterol建立新变量,比如小于80是正常,80-200是临界,201以上是高。要求不包含missing。
DATA health;
SET cert.input08;
LENGTH grade $11;
IF cholesterol ne . THEN DO;
IF cholesterol < 80 THEN grade='normal';
ELSE IF cholesterol <=200 THEN grade='normal-high';
ELSE IF cholesterol >=201 THEN grade='high';
END;
RUN;
问最后normal里有多少obs,high里有多少obs。
这里就是没有定义200-201之间的值,所以200-201之间和原本missing的值一起在grade里都missing。
9.在官方模拟题里有。给数据集,只选择group=A或者B(有大写有小写)的数据。分别算price的median,再把范围外(45-310)的price根据分组分别等于A或者B的median,最后分组算mean。
DATA output45;
SET cert.input45;
WHERE upcase(group) in ('A','B');.google и
RUN;
PROC MEANS DATA=output45 median;
VAR price;
CLASS group;
RUN;
DATA output45a;
SET output45;
IF price lt 45 or price gt 310 THEN DO;
IF group='A' THEN price=61;. Χ
ELSE IF group='B' THEN price=72;
END;
RUN;
PROC MEANS DATA=output45a mean maxdec=0; (答案要求整数,直接一步到位)
VAR price;. Waral dи,
CLASS group;
RUN;. Waral dи,
好像问了output45里面一共多少个obs,然后问了output45a里priceA组的mean是多少。
11.给俩数据集合并,全部合上得一个,全部合不上得一个,问问题。
记得先sort再合并。这里假装sort过了。
DATA match nomatch;
SET input32a(IN=a) input32b(IN=b);
IF a=1 and b=1 THEN OUTPUT match;
IF a=0 or b=0 THEN OUTPUT nomatch;
RUN;
具体问题忘了。反正牢记IN=的用法,1是凡是在该数据集中obs就添加,0是凡是该数据集中的obs都减去。
10.lab就记得这么多,总之proc contents 和proc means 和proc print 几乎是每题都要用,所以练熟一点。. ----
凡是问某个obs的某个变量都精准输出,比如问第55个obs的name:
PROC PRINT DATA=printdata (firstobs=55 obs=55);
VAR name;
RUN;.1point3acres