OPTIONS 语句 OPTIONS 语句是 SAS 程序的一部分,并可影响之后的所有语句。
注意,后面的 OPTIONS 语句会覆盖前面的,即以后面的 OPTIONS 为主。
(也可以通过系统选项来改变)
Option | 作用 |
---|---|
CENTER/NOCENTER | 输出是否居中,还是左对齐。默认居中 |
DATA/NODATE | 今天的日期是否出现在输出的顶部。默认输出 |
LINESEZE | 控制输出行的最大长度,n 可能的值为 64 到 256 |
NUMBER/NONUMBER | 输出的页面页码是否需要。默认需要。 |
ORIENTATION=PORTRAIT; ORIENTATION=LANDSCAPE; |
指定打印输出的方向。默认竖向(portrait) |
PAGENO=n | 输出页开始的页面。默认为 1 |
PAGESIZE=n | 每个页面输出的最大行数。可能的值为 15 到 32767 |
RIGHTMARGIN=n; LEFTMARGIN=n; TOPMARGIN=n; BOTTOMMARGIN=n |
指定打印输出的边缘大小。默认 0.00 英寸(Specifies size of margin(such as 0.75in or 2cm)to be used for printing output.Default:0.00in.) |
YEARCUTOFF=yyyy | 设定起始年份 |
KEEP=,DROP=,和 RENAME=的作用与 keep、drop、rename 很相似。区别在于,后者适用于数据步中的所有变量,而前者仅使用与语句前面的那个数据集。而且,后者仅可以在数据步
中使用,而前者除了数据步和过程步,还可以在输入和输出数据集中使用。
常用选项
选项 | 作用 |
---|---|
lrecl | 指定数据长度,不写则默认256 |
firstobs | 从原始数据的第N行开始读取 |
obs | 读到某一行 |
missover | 不进入下一行,未赋值的变量即缺失值 |
truncover | 如果某一行长度不够,也不转到下一行 |
DLM | 指定分隔符 |
DSD | 忽略引号中数值的分隔符; 自动将字符数据中的引号去掉; 将两个相邻的分隔符当做缺失值来处理。 |
如果长度过长,SAS 不能读取全部,此时需要在 INFILE 语句中使用 LRECL=来指定长度,这个长度必须是数据中最长行的长度。
使用 column input 或 formatted input 输入时可能会需要Truncover,因为这时有的数据行比其他的短。如果某一行没有占满,则必须用truncover,否则会转到下一行继续读取。
DLM=‘09’X指定时,是制表符。
DSD默认分隔符是都好,如果不是都好,要用delimiter来指定。
常用选项
选项 | 作用 |
---|---|
$ | 加在是字符串的变量后 |
@ | 到达某一列,或者读取某一特定字符串后的数据 |
@ | 在input语句结尾加,告诉SAS先停在此行 |
@@ | 停止符号,适用于一行有多个观测值 |
/ | 换行 |
#n | 跳转到第n行开始读取 |
. | 缺少句号会使得SAS把形式当作变量名 |
+1 | 跳过一列 |
: | 遇到空格则不再继续读取,加在$length 前面 |
input name $ age height;
限制条件
input name $ 1-10 age 11-13 height 14-18;
当每个变量的值都出现在数据行的相同位置时,可以使用Column input。
限制条件
优势
2. 不要求变量值之间的空格。
3. 缺失值可以直接用空格代替。
4. 字符串中可以使用空格。
5. 可以跳过不需要的变量。
用于读取非标准格式的原始数据。
input name $10. age 3. height 5.1 +1 birthdate MMDDYY10.;
input parkname $ 1-22 state $ year @40 acreage COMMA9.;
混合读取方式有时会遇到问题:SAS 通过一个指示器标注位置,来读取原始数据的一行,但每种读取方式对指示器的使用稍有不同。List 方式下,SAS 自动找到非空格区域并开始读取; column 方式下,SAS 读取你所指定的特定位置;informatted 方式下,SAS 不理会指示器的标准,只是依次的读取。这时,就会需要列指示器@n,来人为的让 SAS 的读取直接跳至某列。
input @'Breed:' DogBreed :$20.;
第二种方法只要知道要读取的数据的前面那个字符或单词即可。
如果要使 SAS 读取过程中遇到空格则不再继续读取,则要在$length 前面加冒号“:”
input city $ state $
/ normalhigh normallow
# 3 recordhigh recordlow
行指示器:
input city $ state $ normal mean @@;
当一行出现多个观测值时,可以在 input 语句结尾加一个停止符号@@ 。
input tpye $ @;
if type = 'surface' then delete;
input name $ 9-38 amtraffic pmtraffic;
在input语句结尾加@,告诉SAS先停在此行,同时用if语句检测该观测值是否满足需要,如果是,那么再用一个input语句来读取现有的变量。
@的作用类似于@@,都是行停留指示符(line-hold specifiers),不同地方在于停留多久,@能使 SAS 停留到下一个 input 语句(也不换行),@@能使停留的时间到下一个 data 步(也不换行)。
label 语句为变量打上标签,并储存在数据集中,在打印时会显示。过程步中也可以使用 label,但只在 proc contents 中有效,不会储存在数据集中。
retain 语句可以让 SAS 保存前一次变量的值。它可以出现在数据步的任何位置。
RETAIN variable-list (initial-value);
sum(v,expression)
这个语句将表达式的值赋给变量,同时将变量的值保留到下一次迭代。这个变量必须是数值型,且初始值为 0。
array name(n) $ variable-list;
SET 语句可以增加新变量、创建子集、修改数据集。SET 语句是一次一个变量地,将一个数据集放入数据步中予以分析。
data data1;
set northdata southdata;
by passnumber;
data new-data;
if _N_ =1 then set summary-data;
set original-data-set;
只在数据步的第一次迭代中,SAS 读取了 summary 数据集,之后为新数据的所有变量记住这个变量值。它的工作原理在于 SET 语句是自动记住的。往常之中,记住的变量会被下一个观测值改写,但这里变量只在第一次迭代的时候读取,并为所有观测值记住,这一技术适用于没有匹配变量的情况下,将一个单个观测值合并到多个观测值中。
data animals;
set animals(firstobs=101 obs=120);
proc print data=animals (firstobs=101 obs=120);
**数据集选项是用于数据步和过程步中存在的数据集,而系统选项适用于所有的文件和数据集。如果同时使用同样的系统选项和数据集选项,那么后者将覆盖前者。 **
合并前必须要进行排序
data data1;
merge data2 data3;
by v-list;
合并数据集,首先,如果数据没有排序,使用 sort 过程按照匹配变量排序。之后,在 data 语句中对新 SAS 数据集命名,再使用 merge 语句列出要合并的数据集名。使用 BY 语句说明共同变量。
update 语句用来更新大量新数据信息。与 merge 语句一样,都是按照匹配变量来合并数据,不同点在于:
data master-data;
update master-data transaction-data;
by v-list;
只能指定两个数据集,一个是主数据集一个是交易数据,都需要按照匹配变量排序。且 BY 变量必须具有唯一性。
in=option可以用在data步中的任何地方,但是大部分用在merge语句上,接在要追踪的数据集后面。
每一个数据步的结尾都有一个暗含的 output 语句,它告诉 SAS 在处理下一个观测值之前,将当前的观测值写入输出数据集中。可以用自己的 output 语句来推翻这个暗含的 output 语句。
SAS 通常在数据步结尾将一个观测值写入数据中,但可以写入多个观测值,在 DO loop 中或单独使用 output 语句。Output 语句控制何时将观测值写入 SAS 数据集中。
如果数据集中没有 OUTPUT 语句,则暗含在结尾,放置了 output 之后,则结尾的就不在暗含存在。当 SAS 出现 OUTPUT 语句时,则写入一个观测值。
data _NULL_;
set activity.golf;
file 'c:\mydata\nowfile.dat' dsd dlm='delimiter';
put coursename 'golf course' @32 greenfees dollar7.2 @40 'par' par;
run;
_NULL_是告诉 SAS 不要新建数据集,以节省电脑资源。
SET 语句告诉 SAS 读取永久数据集 GOLF.
FILE 语句告诉 SAS 要创建的输出变量的名字.
PUT 语句告诉 SAS 写入的内容和路径。Put 语句包含了两个引用的字符串,“Golf Course”和 “Par”,这两个将插入原始文件中。Put 语句使用@列指示符告诉 SAS 变量的变量值放置在哪里。为 GreenFees 变量赋 DOLLAR7.2 格式。用 put 语句可以完全控制原始文件。
可以用 where 构造子集,它方便快捷,因为他不创建新的数据集。且能够用在过程步中,只有满足条件的观测值才进行proc过程。
常用选项
选项 | 作用 |
---|---|
title | 如果不指定标题,SAS 将以“the SAS system”作为标题在每一页的顶部。 |
noobs | 默认打印观测值数,可以用这个取消 |
label | 默认打印时用变量标签代替变量,用这个取消 |
by v-list | 分类打印,要求必须进行过排序 |
ID v-list | |
sum | 打印变量总数 |
var v-list | 制定打印哪部分变量以及打印顺序,默认打印全部 |
format | 将格式和变量联系起来 |
FORMAT Profit Loss DOLLAR8.2 SaleDate MMDDYY8.;
可以将格式 DOLLAR8.2 和变量 profit、loss 联系起来,把格式 MMDDYY8.和格变量 saledate 联系起来。*读入普通文件
proc import datefile=’filename’ out=data-set DBMS=identifier REPLACE;
*读入access files
proc import database='database-path' datatable='table-name' out=data-set DBMS=identifier REPLACE;
常用选项
选项 | 作用 |
---|---|
DBMS | 文件扩展名不是csv或者txt,或者是DLM格式的 |
replace | 代替名字已经存在的数据集 |
getnames | 从第一行获取变量名,默认为yes |
delimiter | 改变默认的分隔符,默认为空格 |
sheet | 指定需要读取的是哪一个工作簿 |
proc contents data=data-set;
常用参数
参数 | 作用 |
---|---|
POSITION | 查看数据集中变量的顺序 |
proc sort data=lala out=lalala;
by v1 v2...vn;
常用参数
参数 | 作用 |
---|---|
out | 如果缺失out=,则SAS会将排序后的数据集代替原来的数据集。 |
nodupkey | 排序时删除重复值 |
descending | 默认是升序,加在需要降序的变量前面 |
proc format;
value name 'A'='Asia'
1,3,5,7,9='odd'
0<-high ='positive non zero';
如果不加选项,则默认打印出非缺失值个数、均值、标准差、以及最大最小值,下面是用选项可以查看的统计量。
常用选项
选项 | 作用 |
---|---|
var | |
max,min | 最大最小值 |
mean | 均值 |
median | 中位数 |
n nmiss |
非缺失值的数量 缺失值变量个数 |
range | 范围 |
stddev stderr |
标准差 平均标准差 |
sum sumwgt |
求和 权数变量之和 |
noprint | 不需要产生打印结果 |
clm | 双侧置信区间 |
lclm uclm |
单侧(低侧)置信区间 单侧(高侧)置信区间 |
css | 调整的平方和 |
cv | 变异系数 |
kurtosis | 峰度 |
skewness | 偏度 |
probt | probability for Student’s t |
T | Student’s t |
Q1(P25) | 25%quantile |
P1 | 1%quantile |
alpha=0.10 | 修改置信度,默认为0.05 |
如果没有其他语句,proc means 语句会给你数据集中所有观测值和所有数值变量的统计量。
OUTPUT OUT=data-set statistic(variable-list)=name-list ;
proc freq data=datas;
tables v1 v2*v3;
常用参数
参数 | 作用 |
---|---|
agree | 检测分类性,包括 McNemar’s test,Bowker’s test,Cochran’s Q test,and kappa |
statistics | |
chisq | 用卡方统计量检测一致性和同类性 |
cl | 一致性检测的置信区间 |
cmh | Cochran-Mantel-Haenszel statistics |
exact | Fisher’s exact test for tables larger than 2X2 |
measures | 一致性测量,包括 Pearson and Spearman correlation coefficients,gamma,Kendall’s tau-b,Stuart’s tau-c,Somer’s D |
plcorr | polychoric correlation coefficient |
relrisk | relative risk measures for 2X2 tables |
trend | the Cochran-Armitage test for trend |
list | 用list形式打印交叉表(而不是网格) |
missing | 频率统计量中包含缺失值 |
nocol | 强制在交叉表中不打印列百分比 |
norow | 强制在交叉表中不打印行百分比 |
out | 输出数据集 |
proc tabulate data=data;
var analysis-variable-list;
class classification-variable-list;
table page-dimension,row-dimension,column-dimension;
table PCTN*(Locomotion Type);
常用参数
参数 | 作用 |
---|---|
class | 哪些变量将数据分成不同部分 |
table | 定义一个表,可以指定三个维度:页、行、列 |
missing | 考虑缺失数据,一般默认不考虑缺失数据 |
var | 分析列表的计算值 |
format | 改变数据的格式 |
box | 在报告左上角的空格中写一句话,前面要加/ |
misstext | 为空数据格指定一个值,默认是句号,前面要加/ |
row=float | 强制去除空白空格 |
Report 包含 print、means 和 tabulate、sort 的所有功能
proc report nowindows;
column v-list;
常用参数
参数 | 作用 |
---|---|
column | 哪些变量该包括,并以何种顺序,默认全部包括 |
nowindows | 关闭交互report窗口 |
headline | 在顶部下方加一条线 |
headskip | 在顶部下方留一段空白 |
define | 为单个变量指定一些选项 |
missing | 考虑缺失值,一般默认不考虑 |
DEFINE variable/options’column-header’;
break location variable/options;
rbreak location/options;
Location 有两种可能值——before 和 after,决定是之前停顿还是之后停顿。斜杠之后的选项告诉 SAS 插入哪种停顿,主要类型有:
COLUMN Age,MEDIAN N;
COLUMN Age,(MIN MAX)(Height Weight),MEAN;
proc template;
list styles;
run;
transpose 过程可以转置数据集,将观测值转变为变量或将变量转变为观测值。
PROC TRANSPOSE DATA=old-data-set OUT=new-data-set;
BY variable-list;
ID variable;
VAR variable-list;
产生统计量以描述单个变量的分布。这些统计量包括均值、中位数、mode、标准差、偏度和峰度。
默认打印所有的统计量:mean,variance,skewness,quantiles,extremes,t tests,standard error
选项 | 作用 |
---|---|
var | 指定变量,默认计算所有数值变量的统计量 |
normal | 进行正态测试 |
plot | 画出数据的三个图(茎叶图、箱线图、正态图) |
by | 对单个组进行分析,前提是进行了sort排序 |
title | 标题 |
计算最近创建的数据集中的所有数值变量两两相关系数。
proc corr;
var v-list;
with v-list;
VAR 语句中的变量出现在交叉表顶部,而 with 的变量出现在左侧。
默认计算Pearson 积差相关系数。还可以计算spearman(Spearman’s rank correlations);hoeffding(for Hoeffding’s D statistic) ;kendall(for Kendall’stau-b coefficients) 。
proc reg;
model dependent=independent;
plot dependent*independent='symbol'P.*independent='symbol'/ overlay;
注意:
proc anova;
class v-list;
model dependent=effects;
means effects/options;
注意:
将代码融合到现有的 SAS 程序中,每一次创建文件时,不需要通过 export Wizard。
proc export data=data1 outfile='filename' dbms=option replace;
delimiter='&';
如果用的是 Windows 系统,EXPORT procedure 可以创建 Microsoft Access,Microsoft Excel,dBase,和 Lotus files。
默认情况下,Microsoft Excel sheet 的名字与 SAS 数据集一样,通过 SHEET=语句可以指定不同的名字(该语句对 Microsoft Excel 4 or Microsoft Excel 5 无效)。Sheet 名中特殊的字符将转化为下划线,且$不允许放在 sheet 名字的后面。
自动变量 | 作用 |
---|---|
_ N _ | 记录了 SAS 在数据步中循环的次数 |
_ ERROR _ | 如果一个观测值的数据出现错误,ERROR 会被赋值为 1,否则赋值为 0。 |
FIRST.variable LAST.variable |
当使用 BY 语句时,这两个变量才有效。SAS 处理一个观测值时,如果某个变量的新变量值是第一次出现,first.variable 被赋值为 1,其他观测值中被赋为 0。 |
函数基本形式:function-name(argument,argument,…),所有的函数都需要括号,即使没有参数。
函数 | 作用 |
---|---|
MDY(MonthBorn,DayBorn,YearBorn) | 生成yr年m月d日的SAS日期值 |
DAY(day) | 返回日期在一个月里的天数 |
TODAY() | 返回今天的日期 |
QTR(n) | 计算四分之一 |
MEAN(x1,x2,…) | 均值函数 |
Type(str) | 将原来的字母转换成大写字母 |
*一个执行;
if condition then DO;
else if condition THEN action;
else if condition THEN action;
else action;
*多个执行;
if condition THEN DO;
action;
action;
end;
*循环;
do i=1 to 10;
if condition then action;
end;
LISTING 标准 SAS 输出
Output SAS 输出数据集
Html 超文本标记语言
RTF 富文本格式
PRINTER high resolution printer output
PS 附言
PCT Printer Control Language
PDF、MARKUP、DOCUMENT
DOCUMENT 目的地,允许创建一个可重复使用的输出。
储存从过程输出的任何一部分。
首先要使用 ODS TRACE 语句决定选择输出对象名。然后使用 ODS OUTPUT 语句将输出对象发送到 OUTPUT 目的地中。
这个语句不属于数据步和过程步。ODS OUTPUT 打开 SAS 数据集并等待正确的过程输出,数据集保持开放,直到过程步的结尾。因为 ODS OUTPUT 是立即执行的,它将应用于 proc 正在处理的数据,或者应用于下一个 proc(如果目前没有 proc)。为确保得到正确的输出,建议将 ODS OUTPUT 语句放在 PROC 语句之后,下一个 PROC 、DATA 或 RUN 语句之前。
将输出发送到 HTML 目的地,将得到 HTML 格式的文件。
ODS HTML BODY='body-filename.html' options;
Option 是用来改变 HTML 的类型(contents,page,or frame)
储存一个RTF文件。
ODS RTF FILE='filename.rtf' options;
ods rtf close;
一些选项如下:
SAS 宏代码包括两个基本部分:宏命令和宏变量。
注意:
%LET macro-variable-name=value;
%MACRO macro-name(parameter-1=,parameter-2=,...parameter-n=);
macro-text
%MEND (macro-name);
%MACRO 语句告诉 SAS 这是宏开始,而%MEND 则意味着结束。
定义了宏之后,可以通过在宏名称前面增加%来启动宏:%macro-name,注意这里可以不用分号。
将宏作为文件储存在某路径中,或作为分区数据集中的一员。使用 MAUTOSOURCE 和 SASAUTOS=系统选项告诉 SAS 在哪里查找宏。
%IF condition %THEN action;
%ELSE %IF condition %THEN action;
%ELSE action;
%IF condition %THEN %DO; SAS statements
%END;
IF Age>=18 THEN CALL SYMPUT(”status”,”Adult”);
ELSE CALL SYMPUT(”status”,”Minor”);
这个语句创建了宏变量&STATUS,并依据年龄情况分配给值adult 或 minor。
用 call symput 创建的宏变量与赋值变量不能够用在同一个数据步中。因为直到数据步执行之后,SAS 才会将一个值赋给宏变量。
尽可能先用标准 SAS 代码写你的程序,当没有错误了,再转成宏代码,先一次增加一个宏逻辑特征。再增加%macro 和%mend。再增加宏变量。
bug | 报错情况 | 出现信息 | 解决方案 |
---|---|---|---|
merror\nomerror | 如果 SAS 不能找到一个宏,并且 Merror 选项也是开着的 | WARNING:Apparent invocation of macro SAMPL not resolved. | 确认宏名字的拼写是否正确。 |
serror\noserror | 不能在开放代码中处理一个宏变量,并且 serror 选项是开着的 | WARNING:Apparent symbolic reference FLOWER not resolved. | 首先确认是否拼写错误,再次查看视角,即是否在外部使用了一个局部变量。 |
mlogic\nomolgic | SAS 会在日志里打印关于执行宏的详细信息。 | ||
mprint\nomprint | SAS 在日志里打印由宏产生的标准 SAS 代码。 | ||
symbolgen\nosymbolgen | SAS 在日志里打印宏变量的值。 |
如果不幸你的程序出现了问题,你需要再次运行,对于程序编辑窗口,由于之前的程序不在保留,因此需要调回命令(recall)。
最基本的 title 语句为:title ‘标题’,双引号、单引号皆可,比如: TITLE’This is a title’;
如果标题中带有撇号,则需用双引号,或者将撇号换为双撇号:
TITLE”Here’s another title”; TITLE’Here’’s another title’;