参考资料:《SAS 编程演义》, by 谷鸿秋, p90
在新数据集里,我们可能只要部分观测,比如:只要女生。如何挑出女生的观测呢?通常可以从这三个阶段入手:
- 打开数据集时,直接读取只需要的观测;
- PDV 里筛选过滤观测;
- 只写入所需观测进入数据集。
具体执行时,可以借助 IF 或 WHERE 语句选项。
*===第一阶段:通过 WHERE 选项限定读入数据集;
data tmp;
set sashlep.class(where=(sex="F"));
run;
*===第二阶段:通过 IF 或者 WHERE 语句;
*===通过 where 语句;
data tmp;
set sashlep.class;
where sex="F";
run;
*===通过求子集 IF 语句;
data tmp;
set sashlep.class;
if sex="F";
run;
*===第三阶段:通过 WHERE 选项限定输出数据集;
data tmp(where=(sex="F"));
set sashlep.class;
run;
- 在数据集选项里,我们只能用
WHERE,而不能用IF; - 从效率上讲,
WHERE更高效。因为WHERE语句在读入 PDV 之前就先行判断,而求子集IF语句先读入观测进入 PDV,而后再判断; - 从使用范围上讲,
WHERE更广泛。WHREE语句不仅可以用在DATA步,还可以用在PROC步中。此外,WHERE还可以作为数据集选项使用,而IF只能作为DATA步语句使用; IF语句对INPUT语句创建的观测有效,但是WHERE语句只能筛选数据集里的观测;- 有
BY语句时,求子集IF语句与WHERE语句的结果可能会不同,因为 SAS 创建BY组在WHERE之后,求子集IF语句之前; - 求子集
IF语句可以用在条件IF语句中,但WHERE语句不行; - 当读入多个数据集时,求子集
IF语句无法针对每个数据集单独筛选,但是WHERE选项却可以。
大多数情况下,作者喜欢用数据集选项来筛选观测。因此,在筛选观测时,代码大致如下:
*=== WHERE 选项筛选观测;
data want(where=(not missing(id)));
set raw1(where=(age between 20 and 30)) raw2(where=(sex="F"));
run;