今天写一写data步中的几个简单的小语法。
firstobs、obs、end
比较基础与常见的语法,如:firstobs,obs,end...,firstobs表示从数据集第某行记录开始,obs表示读取到第某行记录。end为一个“指针”指向最后一条记录。来看看一个例子~
代码语言:javascript复制data test1;
set SASHELP.CLASS end=last;
if last then aa=1;
run;
data test2;
set SASHELP.CLASS (firstobs=3 obs=5) end=last;
if last then aa=1;
run;
上面代码什么效果,其实对比一下生成的数据集结果就知道了,很容易理解相关的含义...
_N_
_N_这是一个很好的变量,为啥是一个很好的变量呢,_N_的值是对应数据集中的每一条记录的行号。其实就是所谓PDV里面的一个关键变量,什么是PDV呢,好吧,作为一个没有系统学习过和从没完整看完任何一本SAS书的小编,对PDV的概念用不了官方语句来描述出来,只有一个抽象的理解,PDV就相当SAS数据运行的中转站吧,数据集的一切操作要先拿到中转站在从中转站拿出来。应该也是不太准...
感觉知不知道PDV其实不太重要,不知道一样写程序...
代码语言:javascript复制data test3;
set SASHELP.CLASS ;
/*此处会出ERROR:ERROR: 变量 _N_ 不在文件“SASHELP.CLASS”中。*/
where _N_=3;
run;
data test4;
set SASHELP.CLASS ;
if _N_=3;
run;
看上面代码,用where就会出错,用if就不会出错,原因可以理解成where语句的执行是在中转站的入口(数据读入到PDV时)前起作用,而IF语句就相当在中转站出口(数据读出PDV)时起作用。