3.1创建并重新定义数据
基本形式:Variable = expression
3.2使用SAS函数
MEAN:求均值。当数据出现缺失值时,直接相加再除的方法返回缺失值,均值函数将计算非缺失参数的均值。
字符函数 | 用途 |
---|---|
index(S,S1) | 在S查找S1的位置,找不到返回0 |
substr(S,p,n) | 从字符串S中第p个字符开始抽取n个字符长度的子串 |
scan(S2,n) | 从S2中查找第n个单词 |
upcase(S) | 把字符串S中所有小写字母换大写 |
compress(S,S1) | 把S中字符S1 |
trim(s) | 去掉字符串s的尾随空格 |
3.5使用IF-THEN 语句
Symbolic | Mnemonic | Meaning |
---|---|---|
= | EQ | equals |
^=,~= | NE | not equal |
> | GT | greater than |
< | LT | less than |
>= | GE | greater than or equal |
<= | LE | less than or equal |
& | AND | 且 |
| | OR | 或 |
3.8处理SAS的日期数据
SAS简化的日期数据将所有日期转化成一个以1960年1月1日为起点的数。
设定默认的百年 07/04/76这样的数据可能是1976,也可能是2076,1776.因此需要YEARCUTOFF=来指定一个一百年的第一年,默认是1920.下面的语句就是告诉SAS将一个两位年份的日期解释为1950到2049之间: OPTIONS YEARCUTOFF = 1950;
SAS表达式中的日期 一旦被SAS日期格式读取后,可以将数据像其他数值数据一样用在表达式中。
3.9可供选择的Date Informats、Functions和Formats
3.11使用Retain和sum语句
当开始数据步的每一个观测值迭代时,SAS会将所有变量值设为缺失,再通过input和分配语句如retain和sum改变.
Retain语句 retain可以让SAS保存前一次变量的值,基本形式为RETAIN variable-list
也可以指定一个初始值,RETAIN variable-list initial-value
Sum语句 将一个表达式的值累加到一个变量上,基本形式为variable+expression。
这个语句将表达式的值赋给变量,同时将变量的值保留到下一次迭代。这个变量必须是数值型,且初始值为0.
DATA gamestats;
INFILE 'c:\MyRawData\Games.dat';
INPUT Month 1 Day 3-4 Team $ 6-25 Hits 27-28 Runs 30-31;
RETAIN MaxRuns;
MaxRuns = MAX(MaxRuns, Runs);
RunsToDate +Runs;
PROC PRINT DATA = gamestats;
TITLE "Season's Record to Date";
RUN; *一个关于本赛季棒球比赛的数据,需要得到反映本赛季总runs数的RunsToDate,和最大runs数的MaxRuns.
3.12用数组简化数据
SAS中,数组是一组变量,变量可以是已经存在的,也可以是新建的。数组在数据步中用ARRAY来定义,基本形式为: ARRAY name(n) $ varaible-list
ARRAY array-name{subscript} <$><length><arrary-elements><initial-value-list>
其中,name是数组名,n是变量数,()也可以用[]和{}代替。如果变量是字符串,则需要$,变量名依照顺序排列。例如, ARRAY store(4) Macys Penneys Sears Target;
DATA songs;
INFILE 'c:\MyRawData\WBRK.dat';
INPUT City $ 1-15 Age domk wj hwow simbh kt aomm libm tr filp ttr;
ARRAY song (10) domk wj hwow simbh kt aomm libm tr filp ttr;
DO i = 1 TO 10;
IF song(i) = 9 THEN song(i) = .;
END;
PROC PRINT DATA = songs;
TITLE 'WBRK Song Survey';
RUN;
下面都是有效的ARRAY语句:
Array rain{5} x1-x5; /*数组名为rain,有5个元素,分别为x1-x5 */
Array ar(3); /*输出变量默认为ar1-ar3,等价于Array ar(1:3); */
Arrary x{1:5,1:3} score1-score15; /*规定一个5x3的二维数组,变量score1-score15依次从左上角开始逐行放入这个二维数组*/
Array ab(*) x y z; /*等价于array ab(3) x y z; */
Array x[*] _numeric_; /*在数据结构变化的情况下非常有用*/
Array x _character_;
Array test(3) _temporary_ (90 80 70);
Array days{7} d1-d7 (1,2,3,4,5,6,7); /*设定数组days对应7个变量,初始值分别为1到7 */
数组函数:
维度函数DIM(),例如array mult{5,10,2} mult1-mult100; DIM(mult)返回值5,DIM2(mult)等价于DIM(mult,2),返回值10。往往与DO循环一起使用。
数组下确界函数LBOUND()和上确界函数HBOUND()
3.13列出变量名的快捷方式
Number range lists 开始于同一个单词,结尾于连续数字的,如 INPUT Cat8 - Cat12
Name range lists 这种列表是依据变量在数据集中的排序来的,例如创建如下数据步,
DATA example; INPUT y a c h r; b = c+r; RUN;
则变量的排列顺序为:Y A C H R,那么可以依据这个顺序用put y -- b来简化。
注意:SAS还提供了函数调用的另一种语法以便于把多个数据集变量作为函数自变量,其格式为“函数名(OF 变量名列表)”,其中变量名列表可以是任何合法的变量名列表,比如x1 ,x2,x3的和等价地可以用SUM(x1,x2,x3)或SUM(OF x1-x3)表示。注意两种写法不能混在一起,比如SUM(OF x1,x2,x3)和SUM(x1-x3)都是错的。
Special sas name list 特别的名字列表,_ALL_、_CHARACTER_、_NUMERIC_(如列出所有观测中的变量值PUT _ALL_)
DATA songs;
INFILE 'c:\MyRawData\WBRK.dat';
INPUT City $ 1-15 Age domk wj hwow simbh kt aomm libm tr filp ttr;
ARRAY new (10) Song1 - Song10;
ARRAY old (10) domk -- ttr;
DO i = 1 TO 10;
IF old(i) = 9 THEN new(i) = .;
ELSE new(i) = old(i);
END;
AvgScore = MEAN(OF Song1 - Song10);
PROC PRINT DATA = songs;
TITLE 'WBRK Song Survey';
RUN;
自动变量
自动变量 | 说明 | 自动变量 | 说明 |
---|---|---|---|
_N_ | 观测序号 | _CHARCATER_ | 所有字符型变量 |
_ERROR_ | 错误信息变量 | _ALL_ | 所有变量 |
_IORC_ | 错误信息变量 | FIRST.VARIABLE | 同一个by变量组内第一个观测 |
_NUMERIC_ | 所有数值变量 | LAST.VARIABLE | 同一个by变量组最后一个观测 |