R2 | #30天专注橙长计划#~SAS~Day 15

3.3 选择SAS函数

3.4 使用IF-THEN语句

条件语句IF-THEN的基本形式为:IF 条件 THEN 执行;

比如:IF Model='Mustang' THEN Make='Ford';

条件语句中的一些基本比较符号:

R2 | #30天专注橙长计划#~SAS~Day 15_第1张图片

还有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

R2 | #30天专注橙长计划#~SAS~Day 15_第2张图片

输出结果如下:

R2 | #30天专注橙长计划#~SAS~Day 15_第3张图片

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三类:

R2 | #30天专注橙长计划#~SAS~Day 15_第4张图片

输出结果是:

R2 | #30天专注橙长计划#~SAS~Day 15_第5张图片

3.6 构造子集

IF语句可以构造子集,取数据集中的部分数据。

基本形式为: IF expression; 比如: IF Sex='f';

如果IF条件中的数据是真,则数据步将继续执行。

还可以使用DELETE语句,来删除哪些不要的数据: IF expression THEN DELETE;

这两句话是等价的: IF Sex='f'; IF Sex='m'THEN DELETE;

例子 有关于莎士比亚歌剧的清单,Shakespeare.dat,包含歌剧名、首次表演年份、类型:

R2 | #30天专注橙长计划#~SAS~Day 15_第6张图片

下面的代码读取数据,并且用IF语句构造一个只包含喜剧(comedies)的子集:

R2 | #30天专注橙长计划#~SAS~Day 15_第7张图片

输出结果如下:

R2 | #30天专注橙长计划#~SAS~Day 15_第8张图片

观察日志有时能很好的保证我们截取了我们要的数据:

在这个例子中,用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日之后办理的,为新卡:

R2 | #30天专注橙长计划#~SAS~Day 15_第9张图片

输出结果为:

R2 | #30天专注橙长计划#~SAS~Day 15_第10张图片

注意BirthDate没有用日期格式。

3.8 可选择的Date Informats,Functions和Formats 


R2 | #30天专注橙长计划#~SAS~Day 15_第11张图片
R2 | #30天专注橙长计划#~SAS~Day 15_第12张图片
R2 | #30天专注橙长计划#~SAS~Day 15_第13张图片

下面是例子:

R2 | #30天专注橙长计划#~SAS~Day 15_第14张图片
R2 | #30天专注橙长计划#~SAS~Day 15_第15张图片
R2 | #30天专注橙长计划#~SAS~Day 15_第16张图片

你可能感兴趣的:(R2 | #30天专注橙长计划#~SAS~Day 15)