设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1462|回复: 0

SAS语言学习之DATA步文件语句

[复制链接]

30

主题

220

金钱

355

积分

入门用户

发表于 2019-7-22 14:20:49 | 显示全部楼层 |阅读模式
本帖最后由 海蓝无魂 于 2019-7-22 14:24 编辑

1、DATA语句
表示一个数据步的开始, 并给出正被创建的SAS数据集的名字。
1).格式:DATA [SASdataset [(dsoptions)] ]…;
2).说明:SASdataset是这个DATA步正被创建的一个或几个SAS数据集的名字;dsoptions告诉SAS系统关于正被创建的SAS数据集的更多的信息。
3).SAS数据集的名字的种类:
①省略数据集名 DATA; 等价于写: DATA DATA;每运行一次,SAS系统自动给创建的数据集依次命名为DATA1, DATA2, …。
②单水平名字 DATA ABC; SAS系统自动命名为WORK.ABC,这里WORK是隐含的第一水平名字,即库名, 彻底退出SAS系统时,此数据集就消失了, 故称为临时数据集。ABC是第二水平名字,它可以由不超过8个字符组成。
③双水平名字 DATA WWW.ABC; 这里WWW是库标记, 它靠LIBNAME语句建立起与某个目录之间的联系,如: LIBNAME WWW 'C:\HULP'; DATA WWW.ABC;枕明想在C盘的目录名为HULP下建立一个名为ABC.SSD的永久数据集,“.SSD”是SAS系统自动加的, 此文件只供SAS系统调用,用户无法直接阅读。调用方式为: LIBNAME WWW 'C:\HULP'; PROC 过程名 DATA=WWW.ABC;再写其他SAS语句。
④特殊的数据集名 DATA NULL; 和 DATA LAST;前一个语句表明只想用PUT语句来输出一些结果, 但不想创建SAS数据集,可减少使用计算机的资源; 后一个语句表明SAS系统使用一个称为LAST的特殊自动变量来保留在一个SAS程序里最新创建的SAS数据集。注意: 在进入SAS DMS后要建立的第一个数据集名不能用LAST。
⑤同时使用多个数据集名 如果你想对一组含有年龄和另外10个变量的资料按青年、中年、老年创建三个数据集, 可用如下的方法实现:
  1. 1DATA ONE TWO THREE; 
  2. 2INPUT AGE X1-X10; 
  3. 3IF AGE<=35 THEN OUTPUT ONE;
  4. 4ELSE IF AGE>35 AND AGE<=55 THEN OUTPUT TWO;
  5. 5ELSE IF AGE>55 THEN OUTPUT THREE; 
  6. 6CARDS;
复制代码

4).dsoptions(即SAS数据集的选择项):
注意∶下面的②、⑥两个选择项仅当读已存在的SAS数据集时有效。
①DROP=变量名列表 等号后面的所有变量将不出现在此数据集中;
②FIRSTOBS=n 从数据集中第n个观测值开始处理;
③IN=变量名 在SET, MERGE或UPDATA语句里规定一个新变量的名字,其取值指示观测从哪个数据集得到。如: MERGE ONE(IN=A) TWO; 即当前观测取自ONE时, 则A=1,这一信息可用于DATA步中间的程序语句(如: IF A=1 THEN …), 但此变量不进入正被创建的SAS数据集中;
④KEEP=变量名列表 等号后面的所有变量将保留在数据集中;
⑤LABEL='单引号内写标签内容, 字符数应≤40';
⑥OBS=n n指被处理的已存在的数据集的最后一个观测的序号;
⑦TYPE=DATA(或TYPE=CORR) 指定SAS数据集的类型, DATA指一般的数据集、CORR指结构为相关矩阵的数据集, 常由SAS过程自动产生;


2、INFILE语句(输入文件语句)
用来定义一个外部文件, 它需用INPUT语句读取。外部文件可以是已存在磁盘上的, 也可以是从键盘上输入的数据行。
1).格式:INFILE filespecification options;
2).说明:filespecification用来定义文件, options给出选择项;
3).filespecification有以下三种形式:
①fileref(文件标志)
②'filename'(文件名)
③CARDS指明输入的数据紧跟着CARDS语句,
如: INFILE 'C:\HULP\ABC.PRG' options; 这里C:\HULP是文件标志、ABC.PRG是文件名;又如: INFILE CARDS options; 这里CARDS相当于文件标志。
4).下列选择项(options)可以出现在INFILE语句中:
①COLUMN=variable或COL=variable定义一个变量, 其值是指针所在的当前列位置。
②END=variable定义一个变量, 作为文件结束的标志。
③EOF=label是一个语句标号, 当INFILE语句读到文件末尾时, 作为隐含的GOTO语句的目标。
④FIRSTOBS=linenumber要求从指定的行开始读取数据, 而不是从文件的第一个记录开始。
⑤LENGHT=variable定义一个变量, 其值是当前输入数据行的长度。
⑥OBS=n指定从一个顺序输入文件中读取数据的最后一个观测(即第1~第n个观测)。


3.INPUT语句(输入语句)
描述一个输入记录中数值的安排情竣给相应的SAS变量赋输入值,该语句只能用于读入存放于外部文件中的数据或跟随在CARDS语句之后的数值。
1).一般形式:INPUT [specification]…;
2).说明:在INPUT语句中有四种方式描述一个记录值, 即
①列格式输入(column) INPUT variable [$] startcolumn[-endcolumn] [.decimals];
  variable变量名,$指明其前面的那个变量是字符型的,数值型的变量则不写也不需写; startcolumn是包含该变量值的输入记录的第1列的列号, -endcolumn是包含该变量值的输入记录的最后一列的列号。如果变量值只占一列, 则省去-endcolumn。 .decimals如果输入值不包含一个隔开整数部分与小数部分的小数点,decimals用来指明小数部分的位数。如: INPUT number 10-15.2; 读取number的数值时,小数部分是两位。若输入值分别是2314, 2, 400, -140, SAS以.2形式读取的值依次是23.14,0.02,4.00,-1.40。又如: INPUT NAME $ 1-8 AGE 11-12; 这里1-8和11-12指列号。
②自由格式(free-format)或表格式输入(list) INPUT variable [$] [&]…;
  variable变量名,&指明字符袖量值中可能在一处或多处含有单一的空格, 此时不同变量值之间需用两个或两个以上的空格隔开。如:INPUT NAME $ & AGE X1-X4; NAME的值可以形如: J. JONES或J. M. MARY。自由输入格式适用场合:输入的值彼此之间至少有一个空格隔开、用小数点(.)而不是空格表示缺失数据、字符型数值的最大长度为8个字节,除非在LENGTH、ATTRIB或INFORMAT语句中规定了字符袖量的长度。
③指定格式输入(formatted) INPUT variable [formatmodifier] informat;
  variable变量名,formatmodifier修改输入格式读取数据的方式,有两个格式修饰符:“:”和“&”,informat给出读取数据时的输入格式,它总是包括一个(·)或以(·)结尾,如:INPUT NAME $CHAR10. AGE 2.; 这里$CHAR10.和2.分别指定了字符袖量NAME和数值袖量AGE的输入格式; 当输入的值都是以同一方式排列时,就可以用组格式表来表示格式。该格式表是被循环使用的, 直到所有变量都被赋值;带有序号的变量值可用简单的形式列出来, 如:INPUT X1-X5 (4.1); 这表明5个变量的值都按整数部分占两位,小数部分占一位的格式输入,加上小数点共4位。两个格式修饰符的含意: “:”把输入格式与自由格式输入的扫描特征结合起来,表明变量的值是从以下非空格列中读取的, 直到第1次遇到以下三种情况: 下一个空格列、先前定义的变量长度已读满、数据行结束;“&”表明一个字符型输入值可能含有一个或多个嵌在当中的单个空格,此时,不同的数据之间应该用两个以上的空格隔开。
④命名格式输入(named) INPUT {pointercontrol}variable={$}{informat};
  “=”指明使用的是命名格式输入方式。如: INPUT NAME = $ AGE =;

3).高级INPUT语句:用指针来跟踪读取数据的位置。
①列指针控制:绝对和相对列指针控制符分别为“@”和“+”,其作用是把指针移到指定的列,“@5”与“+5”的区别是: “@5”是把指针直接移到每行的第5列、而“+5”是把指针从当前的位置向后移动5列。有9种列指针控制:
@n 把指针移到第n列。如:INPUT @15 AGE 2.;把指针移到第15列, 从数据行的第15-16列读数据值赋给变量AGE。
@pointvariable 把指针移到指针变量所指的列。如: A=15; INPUT @A AGE 2.;
@(expression) 把指针移到表达式值所指的列。如: A=5; INPUT @(A*3) AGE 2.;
@'characterstring' 把指针移到数据行中字符串charaterstring之后的第一个非空格列。
@charactervariable 首先确定字符变量所取值(即字符串)在输入行的位置,然后把指针移到这个字符串之后的第一个非空格列。
@(characterexpression) 先确定字符表达式值的位置,然后移指针到其后第一个非空格列。
@+n 把指针向右移动n列。如: INPUT @20 AGE 2. +4 WEIGHT;
@+pointvariable 把指针移到指针变量值所指的列。如: A=-2; INPUT X 1-15 +A Y 2.;此语句表明从数据行的1-15列取值赋给变量X, 然后指针左移2列从第13列开始取值赋给变量Y。
@+(expression) 把指针移到表达式所指的列。如: INPUT X 1-15 +(-2) Y 2.;
②行指针控制: 其控制符有“#”和“/”, 其作用是把指针移到指定的行。有4种行指针控制:
#n 把指针移到第n行。 
#pointvariable 把指针移到指针变量值所指的行。
#(expression) 把指针移到表达式值所指的行。
/把指针移到下一行的第一列。如: INPUT NAME $ SEX $ / AGE WEIGHT;
③行固定标识符: @和@@两种, 写在INPUT语句的结尾, 其区别在于:一个数据行用多个INPUT语句读取数据, 用一个@结尾;一个输入行数据含有多个观测值,用两个@@结尾。


4.FILE语句(文件语句)
定义当前的输出文件, 并且是一个外部文件,一般要与PUT语句配合使用。其选择项可用来控制文件输出的形式, 还可定义变量来跟踪指针所在的当前行和列的位置、定义在每一个新的输出页中开始打印的抬头。在同一个DATA步中可用多个FILE语句,它是可执行语句,故可用于条件(IF-THEN)语句中, 也可用到其他一些语句。
1).格式:FILE filespecification [options];
2).说明:filespecification用来定义外部文件, options给出选择项;
3).filespecification可有如下形式:
①fileref给出文件标志, 也是PUT语句输出的对象, FILENAME语句把一个外部文件同fileref联系起来;
②'filename'定义外部文件的全名字, 文件名要写在单引号内;
③LOG如果在PUT语句之前不使用FILE语句或使用该语句, 但形式为FILE LOG options;其输出内容都将送到LOG窗口内;
④PRINT把PUT语句产生的数据行输出到标准SAS打印文件中去(若用 “FILE PRINT options;”形式, 则将内容直接送到OUTPUT窗口中去)。
4)用来控制当前输出文件形式的选择项很多,从略。


5.PUT语句
把内容输出到SAS系统的LOG窗口、 SAS过程中的输出文件或任何在FILE语句中定义过的文件中去。由最近的FILE语句指明的文件叫当前输出文件。若在当前的DATA步执行中,PUT语句前没有FILE语句,则PUT语句把内容输出到LOG窗口。PUT语句可以输出变量值或字符串。输出变量值有以下三种方式:列输出格式、自由格式和指定格式。
1).格式:PUT [specification]…;
2).说明:specification指的是变量的值或字符串内容是以何种形式输出的。
3).specification的具体内容有:
①variable列出要输出的变量名;
②'characterstring'指明在PUT语句中要输出的字符串,字符串一定要写在单引号内;
③pointcontrol把指针移到规定的行和列上;
④INFILE输出当前输入文件或CARDS后面的数据行中的最后一行;
⑤ALL输出所有变量的值,包括ERROR,N,以及在DATA步中用命名式输出定义的变量。PUT语句可以没有specification,如: PUT;它把当前输出行的内容输出到当前文件中去,即使当前行是空的, 也是如此。
4)列格式输出 PUT [variable][=] [$] startcolumn[-endcolu
mn] [.decimalplaces];
“=”在输出变量值的同时写上变量的名字及其符号, 其他项的含义见INPUT语句中相应部分。
5)自由格式输出 PUT variable[=] [$];
variable输出变量名,=指定变量值用命名的方式输出,$字符袖量的标志。
6)指定格式输出 PUT variable[=] format.;
=指定变量值用命名的方式输出,其它项的含意见INPUT语句中指定格式输入的相应部分。
7)指针控制与格式修饰符 关于指针控制参看INPUT语句中相应部分, 这里对不同之处作些介绍。
①PAGE把指针移到新的一页的第一行 PUT PAGE;
②OVERPRINT把当前输出内容输出到前一个输出行中 例如要在标题“TITLE OF PAGE”下面加一横线, 其语句是: PUT 'TITLE OF PAGE' overprint '_';
③格式修饰符“n”指明其后的格式将被重复使用n次。如: PUT X1-X5 (57.2);
④格式修饰符“:”,它后面跟一个格式, 指明用此格式输出变量值, 但要去掉前面或后面的空格, 不同数值之间只留一个空格;
⑤输出数组元素: PUT array{}; 数组不能是临时数组,处不能是数组指示变量, 但可以是在PUT语句执行时可估值的任何SAS表达式,也可直接用*号。


6.SET语句
从一个或几个SAS数据集中读取观测值。此语句的适用场合:
①完全复制现存的数据集;
②把一个数据集分成几个子数据集;③把几个现存的数据集合并成一个新数据集。
1).格式:SET [[SASdataset(dsoptions IN=name)…][setop tions]];
2).说明:SASdataset指定一个或几个现存的SAS数据集。在一个SET语句中最多可以指定50个数据集;dsoptions是数据集的选择项; name是产生一个新变量,在DATA步中,如果这个数据集对当前的观测有贡献,其值为1,反之为0;setoptions定义SET语句的选择项。
3).数据集的选择项(dsoptions) 参见DATA语句中相应部分。
4).SET语句的选择项(setoptions) 
①NOBS=name产生一个变量,其值是输入数据集的观测总数。如果多于一个数据集列在SET语句之后,NOBS的值就是所有这些数据集中观测总数。该变量不含在新产生的数据集中。
②END=name产生一个变量,作为文件结束的标志。该变量的初值为0,当SET语句读完输入数据集的最后一个观测或合并后的数据集的最后一个观测时,其值为1。
5).复制新的数据集 把数据集A复制成数据集B的方法: DATA B; SET A;
6).由数据集A生成含有部分变量的子集B,可用下面3种方法之一来实现: 
①在SET语句中使用DROP=或KEEP=的数据集选择项,如: DATA B; SET A(KEEP=X Y);
②在DATA步中使用DROP与KEEP语句,如: DATA B; SET A; KEEP X Y;
③在DATA语句中使用DROP=或KEEP=选择项,如: DATA B(KEEP X Y) C(KEEP Y); SET A;
7).由数据集A生成含有部分观测的子集B,一般要借助子集IF语句来实现,如: DATA B; SET A;IF SEX='M';最后一句还可写成:IF SEX='M' THEN OUTPUT;或IF SEX^='M' THEN DELETE;其目的都是选择SEX的值为M的观测作为新生成数据集的观测。
8).由数据集A生成含有新产生的变量的数据集B,如: DATA B; SET A; TOTAL=SUM(OF X1-X5);
9).数据集的连接 把若干个数据集按先后次序一个一个的连接起来,形成一个大数据集。
①相同变量的数据集的连接,如: DATA C; SET A B;
②不同变量的数据集的连接,如果SET语句后列出的数据集中含有的变量不全相同, 则从一个数据集中来的观测对于那些只有在其它数据集中定义的变量,其值为缺失值。
10).按已排好的顺序合并数据集 要先用SORT过程排序,再借助BY和SET语句来实现,如: PROC SORT DATA=A; BY X; PROC SORT DATA=B; BY X; DATA C; SET A B; BY X;


7.MERGE语句(合并语句)
把两个及以上数据集中的观测合并成一个观测作为新生成的数据集的观测(即一一对应地左右连接),合并观测时的方式依赖于是否有BY语句伴随着MERGE语句。
1).格式: MERGE SASdataset[(dsoptions IN=name)]
  SASddataset[(dsoptions IN=name)]…[END=name];
2).说明: END=name产生一个变量标志着文件的结束,其初值为0,当MERGE语句执行到最后一个观测时,其值为1,该变量不包括在正被创建的数据集中。其他项的含义参见SET语句。
3).一对一合并(没有BY语句)
当没有BY语句伴随MERGE语句时, MERGE语句使全部数据集中的第i个(i=1,2,…)观测依次合并成一行, 成为一个新的观测。新生成的数据集中观测总数为全部数据集中观测个数的最大值。如果某数据集的观测较少,合并后,短缺的那些观测将以缺失值的形式出现; 如果某一个变量同时出现在几个数据集中,合并后,只有一个变量,其值是列在MERGE语句中含该变量的最后那个数据集所对应的数。
4).匹配合并(带有BY语句)
如果想把两个或两个以上数据集按照一些变量值合并,则需借助BY语句来实现,一个MERGE语句只能有一个BY语句相伴随, 并且,各数据集中至少有一个变量(称为BY变量)是相同的,每个数据集必须先按这些变量排序。


8.UPDATE语句(更新语句)
该语句有一个特殊功能, 即用数据集乙(称为修改数据集) 去修改数据集甲(称为主数据集)。该语句一定要用BY语句伴随,BY语句给出合并观测时的共同变量的名字; 主数据集中不能含有多于一个的共同变量值相同的观测。产生的新数据集包含主数据集中的所有观测, 如果修改数据集含有主数据集中没有的观测,则这些观测出现在新的数据集中。
1).格式:UPDATE masterdataset dsoptions [(IN=variable1)
         transactiondataset [(dsoptions IN=variable2)] [END
=variable];
2).说明:master...和transaction...分别为主数据集名和用以修改的数据集名,其他项参见SET和MERGE语句。


9.BY语句
在DATA步中用以控制MERGE、SET或UPDATE语句的运行并建立特殊的组合变量。
1).格式:BY [DESCENDING] [GROUPFORMAT] variable … [NOTSORTED];
2).说明: DESCENDING指明数据集是按下降的次序对其后的变量值进行排序、GROUPFOR-MAT是当SAS给自动变量FIRST.和LAST.赋值时, 指明该语句中的变量是按其格式化值使用的,若缺省, 则用非格式化值、variable定义数据集用以排序的每个变量名、 NOTSORTED指明具有同BY值的观测组合在一起, 但BY值不必按字母或数字顺序排列, 此选择项可出现在BY语句中任何地方。


10.CARDS与CARDS4语句
该语句标志着后面紧跟着数据行。通常用前者, 格式为: CARDS;并用一个分号(独占一行)作为数据行结束的标志; 当数据行中含有分号作为输入数据时,用后者,
格式为: CARDS4;
并用4个连续的分号“;;;;”(独占一行)作为数据行结束的标志。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表