首页 > 代码库 > sas数组

sas数组

ARRAY array-name { subscript } <$> <length> <array-elements> <(initial-value-list)> ; 

*字符型数组输出;
data a; array simple{
3}$ red green yellow ("r" "g" "b"); put red=; put simple(1)=;run;*数值型数组输出;
data a; array simple{
3} red green yellow (1 2 3); put simple(1)=; put red=;run;


 *对于打圆括号的数组定义,要输出时,只需在数组名后面添加相应的下标就行,对于打方括号的数组输出,下标要打上括号

  所以我觉得一律都打上括号更规范;

 data a;
    array simple(3)(1 2 3);
    put simple1=;
 run;

数组定义的方式

array simple{3} red green yellow; 数组名为simple,数组有三个元素,分别对应red green yellow
array x{5,3} score1-score15; 定义5行3列的二位数组,分别对应score1-score15
array ar(3);array(1:3) 两个等价,输出变量默认是ar1-ar3;
array(*) x y z;等价于array(3) x y z;
array x[*] _numeric_;array x _character_;不打方括号也行
array test(3) _temporary_ (1,2,3);这里打不打逗号都无所谓

临时数组的变量没有名字,使用时要用数组名加下标,比如test(1)。临时数组的值总是被自动保存,功能类似于retain.

 

获取数组维度的函数,比如 array mult{3,4,5}   ,分别获取三个维度的大小的函数dim(mult,1) dim(mult,2) dim(mult,3)

对数组值的重复初始化

ARRAY x{10} x1-x10 (10*5);
ARRAY x{10} x1-x10 (5*(5 5));
ARRAY x{10} x1-x10 (5 5 3*(5 5) 5 5);
ARRAY x{10} x1-x10 (2*(5 5) 5 5 2*(5 5));
ARRAY x{10} x1-x10 (2*(5 2*(5 5)));

 
data temp;    input x@@;    cards;    10 20 30    ;run;data test (drop=i); (使用drop选项比drop语句划算)    set temp;    array a(5) a1-a5; *是声明语句,不会执行;    do i=1 to 5;        a(i)=i;    end;run;proc print noobs data=test; *打印出来,不带观测值序号,数据集为test;run;
data missing;    input x y$ z$ m;    cards;    . . . 1    2 . 3 .    ;run;data result;    set missing;    array char _character_; *set一次进入pdv四个变量,两个字符型,两个数值型,这里的意思是获取所有字符型变量形成一个字符型数组;    array numr _numeric_; *这里是获取所有数值型变量形成数值型数组;    do over char;        if char eq "" then char="null";        put "char"; *这里会输出两次,因为四个变量中有两个位字符型,如果你修改读取数据集中字符型和数值型的个数,这里输出的次数也自然会不同;    end;    do over numr;        if numr eq . then numr=0;        put "numr"; *这里会输出两次,因为四个变量中有两个为数值型;    end;run;

 

*输出三科成绩全部及格的人的id以及成绩;
data score; input id$ x y z; cards; a
75 84 65 b 54 74 71 c 51 56 52 d 50 50 60 ;run;data res(drop=k); set score; k=0; *对于这种要判断多个变量的值是否满足某个条件的程序最好都设置一个计数变量,并且在每轮循环之前都有一个清空操作; array numr _numeric_; do over numr; if numr >= 60 then k=k+1; *这里判断的全都是及格的,如果要判断的数不相同,比如有一门大于60有一门大于65,则应该设置一个数组来取下标进行判断; end; if k>2 then output; *这里只有单个数据集所以output后面没加数据集的名字,对多个数据集必须加上;run;proc print noobs data=res;