sas数组,数组的语法与一些特殊定义,获取维度大小
subscript:下标的三种形式
{5,1}5行1列
{1:5,1:2}5行2列
{*}通过计算array的variable的数量来获得参数,*不能与_temporary_连用,在定义多维数组的时候也不可用
array-elements:组成数组的元素的变量名
默认情况下是数组名+序号,但是也可以自己设定(注意是变量的名字,设定好后可以参与运算的那种),还可以有一下四种形式
_ALL_ specifies all variables,If you use _ALL_, all the previously defined variables must be of the same type
_NUMERIC_ specifies all numeric variables.
_CHARACTER_ specifies all character variables.
_TEMPORARY_creates a list of temporary data elements.
initial-value-list:初始化列表
可以用逗号或者空格分隔,他们的类型要一致
可以用这种形式简化要输入的数据<constant-iter-value*> <(>constant value | constant-sublist<)> ,记住前面是重复数,后面才是要重复的数据
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; a = 2; b = 3; c ='c'; array me{*} _numeric_; /*结果只能输出前两个,这个数组起到的作用是接受定义在他前面的所有数值变量的值,不会接受其他值*/ put me(1)= me(2)= me(3)=; run;
data; array new{2:5} green jacobs denato fetzer(5 6 7 8);/*这里的第一个下标是从2开始到5,所以new(2)会输出5,而不是6*/ put new(2)=; run;
临时数组应注意的几点:
1:临时数组的变量没有名字,使用时要用数组名加下标,比如test(1)。
2:不能出现在输出的数据集上,不是临时数组创建的变量会出现在数据集上。
3:不能用特殊下标(*)来引用所有元素
4:数组元素被自动保存,每轮data步不会被置为缺失
临时数组的优点
5:使用临时数组可以少占用内存,加快执行时间。
获取数组维度的函数,比如 array mult{3,4,5} ,分别获取三个维度的大小的函数dim(mult,1) dim(mult,2) dim(mult,3)
对于只有一维的数组,直接用dim(array name)即可
对数组值的重复初始化
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;