3.3 选择SAS函数
3.4 使用IF-THEN语句
条件语句IF-THEN的基本形式为:IF 条件 THEN 执行;
比如:IF Model='Mustang' THEN Make='Ford';
条件语句中的一些基本比较符号:
还有IN比较符,比如这句中IF Model IN('Corvette','Camaro') THEN Make='Chevrolet';代表当Model为Corvette或Camaro的时候,将Chevrolet赋给Make。
一个条件只能有一个执行,如果要多个执行,则需要DO和END关键字。
可以用AND和OR来定义多个条件:IF Model='Mustang' AND Year<1975 THEN Status='classic';
例子 如下的数据包含了模型的名字、年份、制造商和颜色:
下面的代码从cars.dat的原始文件中读取数据,使用IF-THEN语句填满缺失值,并创建一个新变量Status
输出结果如下:
3.5 用IF-THEN语句将观测值分组
IF THEN/ELSE的一般形式为:
IF condition THEN action;
ELSE IF condition THEN action;
ELSE IF condition THEN action;
用else语句与直接用多个IF-THEN语句比起来,有两个优势,第一是更有效率,电脑将占用更少的时间;第二是else可以确保你的两个condition之间互斥。
有时候最后一个ELSE只有action,没有IF-THEN:
例子 有一个住房改善的数据,home.dat,包括了姓名、改善工作、改善成本:
下面的代码读取数据,并新建了一个CostGroup的变量。根据Cost的值将数据分成high、medium、low和missing三类:
输出结果是:
3.6 构造子集
IF语句可以构造子集,取数据集中的部分数据。
基本形式为: IF expression; 比如: IF Sex='f';
如果IF条件中的数据是真,则数据步将继续执行。
还可以使用DELETE语句,来删除哪些不要的数据: IF expression THEN DELETE;
这两句话是等价的: IF Sex='f'; IF Sex='m'THEN DELETE;
例子 有关于莎士比亚歌剧的清单,Shakespeare.dat,包含歌剧名、首次表演年份、类型:
下面的代码读取数据,并且用IF语句构造一个只包含喜剧(comedies)的子集:
输出结果如下:
观察日志有时能很好的保证我们截取了我们要的数据:
在这个例子中,用DELETE等价的语句为:
IF Type='tragedy' OR Type='romance' OR Type='history' THEN DELETE;
3.7 处理SAS的日期数据
日期数据的处理很棘手,有的月份有31天、有的30天、有的28天。SAS简化的日期数据,将所有的日期转化成一个以1960年1月1日为起点的数。比如:
SAS处理日期数据的三个工具为:读取数据的informats,使用数据的函数(functions),打印数据的formats
Informats 读取日期数据需要用formatted input。比如,如何告诉SAS用MMDDYY10. imforat读取名为BirthDate的变量:
INPUT BirthDate MMDDYY10.;
设定默认的百年 07/04/76这样的数据可能是1976,也可能是2076、1776。因此需要YEARCUTOFF=来指定一个一百年的第一年,默认的是1920年。下面的语句就是告诉SAS将一个两位年份的日期解释为1960年到2049年之间:
OPTIONS YEARCUTOFF=1950;
SAS表达式中的日期 一旦被以SAS日期格式读取之后,可以将此数据想其他数值数据一样用在表达式中。比如像为图书馆的书设定21天的还书日期,只需要在结束日期上加上21:
OPTIONS YEARCUTOFF=1950;
通过在表达式中加入引号和字母D,可以将一个日期当做常数来使用,如下的代码创建了一个EarthDay05的变量,并且等于April 22,2005
EarthDay05='22APR2005'D;
函数 SAS日期函数使得操作大大简便,比图today()返回今天的日期。
语句DaysOverDue=TODAY()-DateDue;可以计算一本书应归还还剩余的期限。
Fomats打印日期数据时,还需要将数值换成日期,下面的FORMAT语句告诉SAS用WEEKDATE17.格式打印变量BirthDate。
FORMAT BirthDate WEEKDATE17.;
例子 图书馆有借书卡数据,Dates.dat,包含持卡人姓名、出生日期、卡办理日期。
下面的代码读取数据,计算变量使用期限(expiredate),使用期限为3年;变量expirequarter计算使用期限的四分之一,使用函数QTR()。接着用IF语句来判断一个卡是否为新卡,在2003年1月1日之后办理的,为新卡:
输出结果为:
注意BirthDate没有用日期格式。
3.8 可选择的Date Informats,Functions和Formats
下面是例子: