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 1IN=是一个很是重要的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;
x y z flag 1 a 1 2 b 1 3 c 1 4 d 0 5 e 0
IN=选项的做用在于经过标识输入数据集,达到对不一样输入数据集执行不一样条件操做的目的。 java
<2>固然SET语句的选项还有好多,例如常常用到的选项是KEEP=,RENAME=,WHERE=,FIRSTOBS=,OBS=,NOBS=,POINT=,END=选项,可是这些都不是很难理解,只有上边的IN=选项费了我一点时间,我将个人理解和例子写上去了,但愿能够帮助到你。下边简单介绍一下后边的几个选项应用: 数组
KEEP=:指定的变量(组)进入到PDV,即最终数据集中保存下来的数据。 函数
RENAME=:重命名选项,知识须要对重命名变量用括号括起来。 spa
WHERE=:和SQL的where同样,条件筛选语句,只是要对表达式用括号括起来。 指针
FIRSTOBS=:读取数据集中的观测值开始位置。如:FIRSTOBS=3说明读取数据集的第三条观测做为开始观测。 code
OBS=:指定读取数据集中的观测值的结束位置。同上。 排序
NOBS=:对应的是数据集的观测数,即数据集中数据的总条数。 索引
POINT=:取指定的一条数据。(注意SAS中数组或者数据,开始的第一条是1而不是0)。 开发
END=:标识文件是都结尾。一般这样用:end=last_obs; input
2.BY
BY语句在过程当中通常用来指定一个或几个分组变量,根据这些分组变量值把观测分组,而后 对每一组观测分别进行本过程指定的分析。在使用带有BY语句的过程步以前通常先用SORT过 程对数据集排序。
3.MERGE
merge语句能够实现多表的横向合并。从功能实现的角度,若是是一对1、多对一或一对多的关联,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;7.SUMMARY PROC SUMMARY = PROC MEANS;