首页 > 代码库 > 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 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=选项则能保持每次只读入需要读入的变量;
  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;

 下面是数据集