首页 > 代码库 > sas赋值语句,累加语句,keep,drop,rename,retain
sas赋值语句,累加语句,keep,drop,rename,retain
赋值语句
variable=expression
几种赋值的实例:
x = x1+x2;
x = sum(of x1-x6); 括号中要用of
sum(x,y);如果x或y中有一个为缺失值,sum的结果会将缺失值设为0,而如果用z=x+y;有缺失值的话z的结果会为缺失值
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的长度,那么就可以解决这个问题。
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=选项则能保持每次只读入需要读入的变量;
set sashelp.class(keep = _character_); *只读入字符型变量;
set sashelp.class(keep = _numeric_); *只读入数值型变量;
run;
drop语句的用法和keep一样,套着用就行,另外drop=选项的效率也高于drop语句。
retain语句《不可执行的语句》
这个比较重要了,我先解释下sas的运行机制
sas的data步和run语句之间其实是一个循环,比如当使用set语句的时候,每次set一条观测,一直运行到run;再返回程序开头,继续set第二条观测值,一直将数据集的观测值读取完。
系统每读一遍data步的所有语句时,pdv都会将所有变量设置为缺失值,在sas中用“.”表示。然后在进行接下来的其他语句时,再对变量进行赋值。但是如果我们在data步用到了retain语句
pdv就不会清空retain语句对应的变量,而是一直保留到下次改变了再被执行的时候,这样就能完成我上面说的初始值不为0的累加情况了
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=http://www.mamicode.com/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;
下面是数据集