学习笔记01-赋值语句,累加语句,keep,drop,rename,(retain/sum statement)
赋值语句
variable=expression
几种赋值的实例
-
x = x1+x2;
-
x = sum(of x1-x6); 括号中要用of
sum(x,y);如果x或y中有一个为缺失值,sum的结果会将缺失值设为0,而如果用z=x+y;有缺失值的话z的结果会为缺失值【sum()语句可避免缺失值对加总的影响】
-
ar(1) = br(1); *将数组br的第一个元素赋值给数组ar的第一个元素,sas中数组的下标以1开始;
-
x = x+y;
-
x;
-
x=y=z *如果y=z则x=1否则为0;
赋值语句变量通过表达式计算后的类型有三种情况 《是可执行语句》
-
数值型=数值型+数值型
-
字符型=字符型+字符型
-
数值型=数值型+字符型 (注:后面两个位置可以互换,例如x=“1”+2,如果不能转换,日志窗口会报错)
rename语句
keep语句先于rename语句编译,两者都是不可执行语句.
rename y=yy;
keep x y;
rename选项一定要对所有重命名的变量用括号括起来
结果变量长度
字符型长度为1;数值型长度为8;
变量长度由第一次读入的表达式的运算结果决定,如char=“ab”;那么char的长度为3,无论下一次pdv读入多长的数据,都只会显示两个字节,如果在之前用length语句实现定义char的长度,那么就可以解决这个问题。一般在data步中,length可在set语句前设定。
LENGTH variable-specification(s)<DEFAULT=n>;
length m 5;
length m1 m2 7; *m1,m2两个长度都是7;
length m1 4 m2 6;
lenght m1 3 m2 $8;规定第二个为字符型的变量
累加语句与retain语句的区别《是可执行语句》
variable+expression
例如 x+1 x+(-1) 不能写成x-1 x+(y=z)
在编译阶段pdv自动将累加变量设置为0,如果想要其不为0,那么要用retain语句代替,累加语句可以视为retain的一个特例
Keep,drop语句《不可执行的语句》
Tips: (keep选项和keep语句的区别)
data a1;
set sashelp.class(keep= name sex);
/* keep name sex;*/ *如果使用keep语句而不使用keep选项,那么pdv会读入先所有的变量再保留需要保留的,而用keep=选项则能保持每次只读入需要读入的变量。 如果keep选项紧跟data而非在set后面,效果同此步;
set sashelp.class(keep = _character_); *只读入字符型变量;
set sashelp.class(keep = _numeric_); *只读入数值型变量;
run;
drop语句的用法和keep一样,套着用就行,另外drop=选项的效率也高于drop语句。
retain语句《不可执行的语句》retains values from the previous iteration of the DATA step
这个比较重要了,我先解释下sas的运行机制
sas的data步和run语句之间其实是一个循环,比如当使用set语句的时候,每次set一条观测,一直运行到run;再返回程序开头,继续set第二条观测值,一直将数据集的观测值读取完。
系统每读一遍data步的所有语句时,pdv都会将所有变量设置为缺失值,在sas中用“.”表示。然后在进行接下来的其他语句时,再对变量进行赋值。但是如果我们在data步用到了retain语句
pdv就不会清空retain语句对应的变量,而是一直保留到下次改变了再被执行的时候,这样就能完成我上面说的初始值不为0的累加情况了
retain的基本语法
RETAIN variable-list; list中的值都为缺失
RETAIN variable-list initial-value; 为list中的值设定初始值value
sum语句也能达到retain的效果
variable + expression;
The variable must be numeric and has the initial value of zero.
This statement adds the value of the expression to the variable while retaining the variable’s value from one iteration of the DATA step to the next。
下面两句和sum语句起到的效果一样
retain variable 0;
variable = sum(variable+expression);
data a1;
retain m1-m5 (1); *m1为1其余权威缺失值;
retain m1-m5 1; *m1-m5全为1;
retain m1-m5 (1,2,3,4,8); *给每个赋予不同的值,和下面的没区别,需要分开执行;
retain m1-m5 (1 2 3 4 5);
retain m1-m5 (1:5);
put m1-m5;
run;
libname chapt4 'E:\sas-data\Book_data\Book_data\chapt4';
proc sort data=chapt4.retain1;by id ;run;
data a1;
set chapt4.retain1;
by id ;
retain cns_sum id_cnt txn_cde_conditon txn_dte_min; *如果省去retain txn_dte_min则每次循环,其值会为缺失值;
if first.id then do;
cns_sum=0;
id_cnt = 0;
txn_cde_conditon=0;
txn_dte_min=txn_dte;
end;
put cns_sum=;
cns_sum+cns; *但是如果不用省去前面的retain cns_sum id_cnt txn_cde_conditon,这些值不会出现错误,当不出现赋值语句的时候,只是累加,这些值在每轮循环中不会被置为缺失值,还是会有retain的效果;
id_cnt+1;
txn_cde_conditon+(txn_cde in ("101" "201"));
put txn_dte_min= txn_dte=;
txn_dte_min=min(txn_dte,txn_dte_min);*但是有赋值语句,就不能丢掉retain语句;
if last.id;
put "last.id";
run;
下面是数据集
转载自:https://www.cnblogs.com/yican/p/3804604.html