第8讲SAS编程两步结构之数据步(data步)语法详解
⼀、data步流程
1. data语句标志了数据步开始,并指定了数据步结束时要⽣成的数据集名字。
2. 每次读⼊⼀⾏数据,读⼊后执⾏数据步中的其他语句,循环数据步读取整个数据。
3. _N_变量表⽰data步已经执⾏的次数
4. _error_变量值为1时表⽰程序出错
例1:flow
data flow;
/*put x = y = z = _n_;*/
input x y;
z = x + y;
put x= y= z=;
put _n_= _error_=;
cards;
1020
100200
10002000
;
run;
5. 读外部数据时,数据步迭代(即每⼀次)的开始把变量的值置为缺失值,有⼏种情况例外:
(1)retain语句提到的变量;
(2)sum语句中创建的变量;
(3)数组_temporary_中的数据元;
(4)file和infile语句选项中创建的变量;
(5)⾃动变量
6. 读sas数据集时,只在第⼀次迭代时把变量值置为缺失,以后变量保留其值直⾄新值写⼊
⼆、data语句
1. data语句的选项
drop选项:不列出某些变量
keep选项:列出某些变量
label选项:给数据集加标签
rename选项:重命名变量
例2:data
data new1(drop=z);##删除z变量
t flow;
run;
data new2(keep=x);##保留x,yz删掉
t flow;
run;
data new3(label='the new3 datat');
震耳欲聋的近义词t flow;
硕士几年
古琴十大名曲run;
小飞侠彼得潘读后感data new4(rename=(x=xx,y=yy));
t flow;
run;
proc print data=new1;
run;
proc print data=new2;
run;
2. 数据集的名字
(1)data语句后⽆数据集名字,则⾃动⽣成data1,data2等为数据集名字,相当于data_data_;
(2)data_null_;不产⽣实际的数据集,只是把内容暂存于内存,以供put语句等读取结果,可以节约计算机资源;
(3)data_last_;以最近产⽣的数据集命名并取代其内容。
(⼀)⽂件操作语句
1. input语句
(1)分组格式:
input(g1-g5)(37.2,25.2);
5.)input(ab)(
input(a b)(,5.)
(2)@@-⽆需分⾏⽽按变量连贯读数据
例3:input@@
data;
input x y @@;
cards;
1234
;
run;
proc print;
run ;
怎么删除页眉页脚(3)@-固定该数据⾏;⽤于需要多个input语句同时读取⼀⾏数据
(4)利⽤@n、+n、#n进⾏指针控制
(5)⼏个特殊符号的⽤法(:& ~)
①:读值时第⼀次遇到分隔符、或是数据⾏末尾、或是读满列数⽽结束
②&字符型输⼊值可以嵌有⼀个或⼏个空格
③~字符型输⼊值保留引号(与infile语句中选项dsd⼀起使⽤才有效)
2. cards语句
(1)cards语句与datalines语句可以通⽤
(2)如果输⼊数据中含有分号,可⽤cards4语句或datalines4语句,同时,数据结尾⽤4个分号表⽰数据输⼊结束3. put语句
(1)put语句负责在log窗⼝输出⼀些结果,file print选项可把输出转移到output窗⼝
(2)put_infile_(输⼊最新的数据⾏到 SAS log 窗⼝)
(3)put_all_(输⼊所有变量的值)
(4)put_page_(输出新页)
4. file语句
file print把put语句产⽣的输出结果转移到output窗⼝
5. by语句
在data步中,SAS系统对每个by组创建两个临时变量:
first.variable
last.variable
它们⽤来区别每个by组的第⼀个和最后⼀个观测
6. t 语句
(1)使⽤t语句复制数据集
(2)point选项指明要读⼊的记录序号
t数据集point=指针变量;
可⽤于抽样,⼀般与output语句连⽤
(3)nobs选项创建⼀个临时变量⽤来存储数据集的观测总数
(4)t语句可以串接多个数据集,形式如下:
data数据集;
t数据集A 数据集B ……;
<by变量;>
run;
(5)rename选项负责改名;in选项产⽣变量负责记录观测来⾃该数据集
例4:t
data abc;
弱不禁风的意思anges;
run;
proc print;
run;
例5:point
data zxs;
do n=2to total;
t sasur.flow point=n nobs=total;
/*if _error_=1 then abort;*/
宗的成语
output;
end;
stop;
run;
proc print data=zxs;
run;
7. merge语句
使⽤merge语句并接多个数据集,形式如下:
data数据集;
merge数据集1数据集2 ……;
by变量;
run;
8. update语句
(1)update语句⽤⼀个升级数据集中的观测来修改⼀个主数据集
(2)update语句⼀定要与by语句⼀起使⽤,by语句给出了合并观测时共同变量的名字
(3)主数据集中的共同变量必须是单值的,即不能有2个或2个以上的观测其共同变量值相同
9. infile 语句
(1)delimiter(DLM)选项:规定⼀个字符替代空格作为分隔符;
(2)firstobs 选项:不是从⽂件的第⼀个记录开始,⽽是从指定⾏开始读取记录;
(3)obs 选项:规定⽤户想从输⼊⽂件中连续读取的最后⼀个记录号
例6:infile(dlm)
data new1;
infile cards delimiter=',';##delimiter可简写为dlm
input x y z;
cards;
1,2,3女性肾虚的症状
4,5,6
;
data new2;
infile cards dlm='ab';##定义 ab 为分隔符,则其任意组合aa、ab、ba、bb也为分隔符
input x y z;
cards;
1aa2ab3
4bb5ba6
7a8b9
;
run;
proc print data=new1;
run;
proc print data=new2;
run;
(4)dsd选项:
①使最外层引号括起的内容当成整个字符串输⼊,并去除最外层引号;
②默认分隔符为逗号;
③2个相邻的分隔符意味着前⼀个分隔符后的字段为缺失值
(5)当⾏末尾数据宽度少于规定宽度时
flowover:默认选项,将下⼀条记录读⼊
missover:将变量置为缺失
truncover:将数据直接读⼊,不管宽度是否少于规定宽度
stopover:系统终⽌数据步执⾏,报告出错
例7:missover
data;
infile'e:\SAS\missover.dat';/*flowover missover truncover stopover pad*/
input x 5.;
run;
proc print;
run;
(6)lrecl=n选项:设定源数据⽂件⾏的物理长度,缺省为256,最⼤可设为32767
(7)pad | nopad 选项:pad 选项指当宽度少于规定宽度时,在后⾯填充空格⾄ lrecl=n 规定的⾏长度,缺省为 nopad (⼆)运⾏语句
1. 赋值语句和累加语句