SET语句从一个或多个SAS数据集中读取观测值并实现纵向合并。每一个SET语句被执行时,SAS就会读一个观测到PDV中。一个DATA步可以有多个SET语句,每个SET语句又可以跟多个SAS数据集。多个SET语句含有多个数据指针,多个SET语句被执行时,SAS会按照自动变量_N_合并每个SET语句后面所有数据集的观测到一个PDV中。
<1>IN=选项。
IN选项,当读入多个SAS数据集时,用IN选项可确定本观测来自哪个数据集;
variable=0表示观测不是来自本数据集
variable=1表示观测是来自本数据集
例子:
data one;
input x y $ @@;
cards;
1 a 2 b 3 c
;
data two;
input x z $ @@;
cards;
4 d 5 e
;
data in1;
set one(in=ina) two(in=inb);
in_one=ina;/*此处我自己的理解是这样的:前一行括号中的ina是自己定义的一个标识,表示对应的观测值在不在数据集中*/
in_two=inb;/*此时将ina和inb赋值给in_one和in_two并在数据集in1中显示*/
run;
数据集in1结果如下:
x y z in_one in_two
1 a 1 0
2 b 1 0
3 c 1 0
4 d 0 1
5 e 0 1
IN=是一个非常重要的SAS数据集选项,它可以把SET语句后面不同的数据集通过标识变量显示出来。但是由于IN本身不是变量,因此不能直接通过赋值语句如in_one=in 得到标识变量,而只能先在PDV里面创建一个临时变量(该例是ina和inb),然后把临时变量的值赋给输出变量(该例对应的是in_one和in_two)。当然,不一定非要创建输出变量。如:
data in2;
set one(in=ina) two(in=inb);
if ina=1;then flag=1;else flag=0;
run;
数据集in2的结果如下:
x y z flag
1 a 1
2 b 1
3 c 1
4 d 0
5 e 0
IN=选项的作用在于通过标识输入数据集,达到对不同输入数据集执行不同条件操作的目的。
<2>当然SET语句的选项还有好多,例如经常用到的选项是KEEP=,RENAME=,WHERE=,FIRSTOBS=,OBS=,NOBS=,POINT=,END=选项,但是这些都不是很难理解,只有上边的IN=选项费了我一点时间,我将我的理解和例子写上去了,希望可以帮助到你。下边简单介绍一下后边的几个选项应用:
KEEP=:指定的变量(组)进入到PDV,即最终数据集中保存下来的数据。
RENAME=:重命名选项,知识需要对重命名变量用括号括起来。
WHERE=:和SQL的where一样,条件筛选语句,只是要对表达式用括号括起来。
FIRSTOBS=:读取数据集中的观测值开始位置。如:FIRSTOBS=3说明读取数据集的第三条观测作为开始观测。
OBS=:指定读取数据集中的观测值的结束位置。同上。
NOBS=:对应的是数据集的观测数,即数据集中数据的总条数。
POINT=:取指定的一条数据。(注意SAS中数组或者数据,开始的第一条是1而不是0)。
END=:标识文件是都结尾。通常这样用:end=last_obs;
2.BY
BY语句在过程中一般用来指定一个或几个分组变量,根据这些分组变量值把观测分组,然后 对每一组观测分别进行本过程指定的分析。在使用带有BY语句的过程步之前一般先用SORT过 程对数据集排序。
3.MERGE
merge语句可以实现多表的横向合并。从功能实现的角度,如果是一对一、多对一或一对多的关联,merge语句和SQL基本上是一样的。但是对于多对多的关联,两者有很大的差别。在实际操作中,多对多的情况是需要用SQL实现的。
注意:
【1】对需要用到BY语句的merge,merge后面所有表在merge之前都需要排序。
【2】相对于SET语句,IN=选项在merge语句中应用更广泛。
【3】BY语句后面的变量必须是merge语句后面所有数据集共同变量,所以有时候需要对表中的变量重命名。
【4】在匹配合并中,如果merge后一个数据集出现空值,则空值也会覆盖前一个表的值。
4.KEEP
KEEP=选项保证在读入数据集时只有KEEP=后面的变量进入PDV,而数据集其他所有变量将不会进入PDV。
例子:
data a1; data a2;
set sashelp.class(keep=_character_); set sashelp.class(keep=_numeric_);
run; run;
此程序将保留数据集class所有字符型变量。 此程序将保留数据集class所有数值型变量。
还可以用下边的形式,来创建多个数据集,保留不同的变量:
data a3(keep=name) a4(keep=weight);
set sashelp.class;
...;
run;
此程序经过DATA步一系列操作之后,输出两个数据集:a3只有name变量;a4只有weight变量。
5.DROP
DROP语句是KEEP语句的反向声明语句,规定输出数据集中要删除的变量,同KEEP一样,对DATA步中正在创建的所有SAS数据集都适用。
DROP语句有如下两个重要的功能:
<1>读入数据集用DROP=选项效率高于DROP语句。
<2>既可以删除变量列表,也可以在输出数据集中删除不同变量。
6.SORT
SORT对数据集中的观测排序。对数据集进行合并和更新等在使用前必须经过对BY变量进行排序。
<1>常用选项说明:
DATA=:规定被排序的数据集,默认为最新创建的数据集。
OUT=:创建输出数据集,省略该选项时用排序后的数据集替换原数据。
EQUALS;保持BY组内的排序。
NOEQUALS:允许BY组内顺序变化。
NODUPKEY:删除重复BY值对应的观测。
NODUPRECS:删除重复观测值。
FORCE:删除实施多余排序。排序并替换原来加索引或取子集的数据集;在没有规定OUT=选项时,在下列情况下应该使用FORCE选项:数据集有索引、使用了OBS= 和FIRSTOBS=选项、使用DATA=规定被排序数据集时使用了WHERE选项、PROC SORT中使用了WHERE选项。
BY:PROC SORT中必须使用BY语句,BY语句中可以指定一个或多个变量。默认时升序排序。可以使用DESCENDING对变量进行降序排序,但是要注意DESCENDING一定
要放在降序变量之前。
<2>在商业实践中,最常用的就是两个选项。OUT和NODUPKEY。注意几点:
【1】如果使用了NODUPKEY选项,最好使用OUT=选项。否则原有数据集会被 SORT后NODUPKEY删除掉一部分观测,万一程序开发有误,又要重新生成原来的数据集。而使用OUT=选项可以保证原来的数据集不变,把NODUPKEY后产生的观测输出到新的数据集中。
【2】如果有多个字符型变量需要SORT,则在SORT之前使用诸如CATT之类的字符拼接函数拼接所有需要SORT的字符变量,并且最好使用OUT=选项,以提高程序运行效率。
例子:
data a;
length cat $100;
input x1 $ x2 $ x3 $ y;
cat=catt(of x1-x3);
cards;
a1 b1 c1 1
a2 b2 c2 2
;
run;
proc sort data=a out=b;
by cat;
run;
PROC SUMMARY = PROC MEANS;
来源:oschina
链接:https://my.oschina.net/u/1866370/blog/595240