Contents
- 基础知识
- DATA语句
- PROC语句
- 函数
- ODS(output delivery system)
- 宏
- ?反正我还没看懂等会儿再看吧
- 不太重要但是也许会用到的知识谁说的好呢
- 可能要整理一下的专题没有自动标签功能真的很头疼
基础知识
- 分号结尾;
- 字母或者下划线开头;
- 不区分大小写;
- 数据步按照一行一行、一个观测值一个观测值的顺序执行;
- 注释方法:一种是*号,一种是用/**/表示,注意第二种注释方法不能放在第一列;
- SAS的所有函数都需要括号,即使没有参数;
- 列出变量名时可以有快捷方式,如:cat8-cat12;y–b之类。如果不能确定数据集中的变量顺序,可以用proc contents的postion选项来查看。
Option语句
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 | 设定起始年份 |
SAS数据集选项
- KEEP=variable-list 告诉 SAS 保留哪个变量
- DROP=variable-list 告诉 SAS 丢弃哪个变量
- RENAME=(oldvar=newvar) 重命名某个变量
- FIRSTOBS=n 从观测值 n 开始读取变量
- OBS=n 到观测值 n 停止读取
- IN=new-var-name
KEEP=,DROP=,和 RENAME=的作用与 keep、drop、rename 很相似。区别在于,后者适用于数据步中的所有变量,而前者仅使用与语句前面的那个数据集。而且,后者仅可以在数据步
中使用,而前者除了数据步和过程步,还可以在输入和输出数据集中使用。
DATA语句
infile
常用选项
选项 | 作用 |
---|---|
lrecl | 指定数据长度,不写则默认256 |
firstobs | 从原始数据的第N行开始读取 |
obs | 读到某一行 |
missover | 不进入下一行,未赋值的变量即缺失值 |
truncover | 如果某一行长度不够,也不转到下一行 |
DLM | 指定分隔符 |
DSD | 忽略引号中数值的分隔符; 自动将字符数据中的引号去掉; 将两个相邻的分隔符当做缺失值来处理。 |
-
如果长度过长,SAS 不能读取全部,此时需要在 INFILE 语句中使用 LRECL=来指定长度,这个长度必须是数据中最长行的长度。
-
使用 column input 或 formatted input 输入时可能会需要Truncover,因为这时有的数据行比其他的短。如果某一行没有占满,则必须用truncover,否则会转到下一行继续读取。
-
DLM=‘09’X指定时,是制表符。
-
DSD默认分隔符是都好,如果不是都好,要用delimiter来指定。
input
常用选项
选项 | 作用 |
---|---|
$ | 加在是字符串的变量后 |
@ | 到达某一列,或者读取某一特定字符串后的数据 |
@ | 在input语句结尾加,告诉SAS先停在此行 |
@@ | 停止符号,适用于一行有多个观测值 |
/ | 换行 |
#n | 跳转到第n行开始读取 |
. | 缺少句号会使得SAS把形式当作变量名 |
+1 | 跳过一列 |
: | 遇到空格则不再继续读取,加在$length 前面 |
List input
input name $ age height;
限制条件
- 你必须读取所有的数据记录,不能跳过某些值、缺失值必须用句号“.”代替。
- 字符串数据不能包含空格、长度不能超过 8 个字符。
- 如果数据文件包含日期变量或者其他需要特别处理的变量,list input 将不再适用。
虽然很多限制,但仍有大量的文件可以用这种方式读取。
Column input
input name $ 1-10 age 11-13 height 14-18;
当每个变量的值都出现在数据行的相同位置时,可以使用Column input。
限制条件
- 变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的 E。逗号和日期都不能算)。
优势
2. 不要求变量值之间的空格。
3. 缺失值可以直接用空格代替。
4. 字符串中可以使用空格。
5. 可以跳过不需要的变量。
informates
用于读取非标准格式的原始数据。
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
行指示器:
- 斜线/:告诉 SAS 跳至原始数据的第二行
- #n:跳至第 n 行,n 代表原始数据中某观测值的行数
一行有多个观测值
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 语句为变量打上标签,并储存在数据集中,在打印时会显示。过程步中也可以使用 label,但只在 proc contents 中有效,不会储存在数据集中。
retain
retain 语句可以让 SAS 保存前一次变量的值。它可以出现在数据步的任何位置。
RETAIN variable-list (initial-value);
sum
sum(v,expression)
这个语句将表达式的值赋给变量,同时将变量的值保留到下一次迭代。这个变量必须是数值型,且初始值为 0。
数组array
array name(n) $ variable-list;
- Name 是数组名,n 是变量数,()也可以用[]和{}代替。如果变量是字符串,则需要 , 且 变 量 是 新 创 建 的 字 符 串 时 , ,且变量是新创建的字符串时, ,且变量是新创建的字符串时,