第一章:DATA步阐述
DATA步是SAS的一个关键步,正确理解其执行过程将会学习起来更方便。
1)DATA步是一个循环,数据是一行一行地执行(与SQL过程不同,它是对整个数据集进行操作);
2)DATA步在执行时,将数据放在PDV中,在这里将数据整理成想要的格式
3)有三种情况可将PDV中的数据输出到数据集中,OUTPUT语句,return语句,data步结尾(;或run;)
Output语句:此语句出现在data步中间时,将PDV中数据输出到SAS数据后,继续执行直到data步结尾。 Return语句:将pdv中数据输出到SAS数据集后,返回到data步开头,执行下一次循环。 data步结尾(;或run;):缺省形式,也是必须语句,否则DATA步不完整。相当于一个放在data步结尾处的return语句。
注:当一个DATA步中含有OUTPUT语句时,当执行到语句output时才输出PDV中的数据,data步结尾处的默认输出不起作用。
4)退出SAS数据步:stop语句和abort语句;其作用是退出DATA步,并丢掉PDV中的数据。
data aa; data aa; input ss pay;
input ss pay;
if _error_ then delete; if _error_ then abort; pi=constant('PI');/*常数pi*/ pi=constant('PI');/*常数pi*/ format pi 15.13;
format pi 15.13;
e=CONSTANT('e');/*常数e*/ e=CONSTANT('E');/*常数e*/ datalines; datalines; 111 100 111 100 aaa 200 aaa 200 444 300 444 300 run;
run;
proc print;run; proc print;run;
结果相同(只读取了第一条观测),左边在LOG窗口显示一个提示,右边则显示一个出错信息
注:abort
5)DATA步的短路: IF expression;(子集IF语句):若表达式是假,系统立即返回到DATA步开头,继续执行下一条观测,且不处理当前观测。
If expression then delete; 若表达式成立,则丢掉PDV中数据,直接返回到data步开头
6)INPUT语句读入数据要么在CARDS(DATALINES)到结尾RUN语句之间的数据区中读取(忽
略数据区,从而可看到DATA步的完整结构),要么在infile语句中指定的外部数据文件中读取。
数据指针和程序数据矢量(PDV)
语句 指针数 PDV数 INPUT variables 1 1 SET data1 data2 1 1 MARGE data1 data2 1 1 UPDATE data1 data2 1 1 SET data1; SET data2; 2 1 SET data1; MODIFY data2; 1 2 MODIFY data1 data2; 1 2 控制数据指针的变量 自动变量 说明 备注 _N_=m 指向对应的第m条观测 _N_=0表示数据集文件信息 POINT=n(variable) 指向第n条观测 END=variable Variable中保存的是文件结尾标志(逻辑值) NOBS= variable Variable保存数据集的所有观测数 编译阶段完成 FIRST=m 从第m条观测开始读入 OBS=n 读入的最后一条观测数
DATA步首先它是一个循环(程序),其操作对象是PDV, PDV的结构非常简单,数据结构(定义一行的变量)及一行观测。因而DATA步也是围绕着变量和观测进行。关于变量和观测的操作见第四章和第五章。
改变循环的方法有两种,短路和退出(上面已列出) 毕竟DATA步是加工数据的,因而特殊地有关于将PDV输出到数据集的操作(output,return) 然而DATA步编程中有自己的循环语句,有其短路(countine)和退出(leave)语句。
第2章 SAS编程基础
Sas系统在运行期间需要处理大量的数据及相关文件,SAS会把这些文件组织在一个所谓的库里面,这样方便存取。
SAS逻辑库(用libname建立库,库名不超过8个字符)
SAS数据集(通过二级名法建立数据集,数据集名可达32个字符)
SAS数据文件(包括描述信息,数据表,索引,变量长度亦可达32个字符,sas7bdat
扩展名)
SAS数据视图(不是数据实体,只是一个查询语句,节约空间) SAS目录(用于存储宏程序,用户自定义格式,日志产生的数据文件) 其他SAS文件(存储编译程序产生的文件和访问描述器)
以下程序产生Test数据集(table),View1数据视图(view),Sasmacr宏目录(catalog),Formats格式目录(catalog)
data test; input x y z @@;
cards; 1 2 3 4 5 6 ; run; proc sql;
create view view1 as select *
from sashelp.class ; quit;
proc format; value fmt 1='a' ; run;
%macro test; data test; x=1; run;
%mend test; %test;
2.1 SAS逻辑库
库名的长度不超过8
libname fv ' F:\\Data_Model\\Book_data\\chapt2';
提交后,在SAS中的Explorer中可看到fv库。用右键→Properties就可以看到与之对应的windows目录
libname fv excel ' F:\\Data_Model\\Book_data\\chapt2';
则建立库fv后,还直接存取该目录下的excel工作簿中的工作表单。
libname hsdb db2 user=xxuser password=\ datasrc=datadb;
libname fv clear; 删除库标记
→→
建库及使用
libname fv ' F:\\Data_Model\\Book_data\\chapt2'; data fv.forever; Input x y z; Cards; 1 2 3 4 5 6 ; run; 临时库
data temp;/* 相当于data work.temp;*/ Input x y z; Cards; 1 2 3 4 5 6 ; run;
省略二级名的方法一(用特殊逻辑库名user)
libname user ' F:\\Data_Model\\Book_data\\chapt2'; data forever; Input x y z; Cards; 1 2 3 4 5 6 ; run;
省略二级名的方法二(推荐) options user=fv;
libname fv ' F:\\Data_Model\\Book_data\\chapt2'; data forever; Input x y z; Cards; 1 2 3 4 5 6 ; run;
options user=work; data temp; Input x y z; Cards; 1 2 3 4 5 6 ; run;
读取SAS数据集的信息并保存
proc contents data=sashelp.class out=class_cnt;run; 创建SAS视图(法二)
Data步创建
Data class1/view=class1; Set sashelp.class; Run; SQL过程创建 Proc sql;
Create view class2 as
Select * from sashelp.class; Quit;
2.2 SAS索引
存储变量值与该值对应的定位指针系统(可独立存储,若非必要,可不用),一旦创建索引后面就不能进行排序。
Data步创建索引
data idx(index=(x)); input x y z; cards; 1 2 3 ; run;
SQL过程创建索引 proc sql;
create index y on idx (y)/*定义单一索引,单一索引名必需与变量名相同*/; create index yz on idx (y,z);/*定义复合索引,复合索引名不能与变量名相同*/ quit;
DATASETSf过程创建索引
proc datasets lib=work; modify idx;
index create z/nomiss unique;/* 定义单一索引*/
index create xyz=(x y z)/nomiss unique;/* 定义复合索引*/ quit;
注:nomiss从索引中删除具有缺失值的观测,但不影响原始数据文件里面的缺失值观测。 Unique规定变量的值必需唯一。
/*删除指定索引*/ Proc Sql;
Drop Index X On Idx; Quit;
/*删除全部索引*/ Proc Datasets; Modify Idx;
Index Delete _All_; Quit;
2.3 SAS变量
变量命名规则 变量的属性: