从程序员到数据科学家:SAS 编程基础 (9) | 您所在的位置:网站首页 › sas数组循环 › 从程序员到数据科学家:SAS 编程基础 (9) |
arrayarray_cx [3] $ 2; /*不但可以指定元素的类型,也可指定长度 2 个字符*/ run; 下面的代码分别定义了若干3个元素的数值型/字符型数组,系统会默认生成一系列变量 array_n1,array_n2,array_n3,array_c1, array_c2, array_c3 等。 data_null_; arrayarray_n [3]; array_n[1]=1;array_n[2]=2;array_n[3]=3; arrayarray_c [3] $; array_c[1]='a'; array_c[2]='b'; array_c[3]='c'; /*系统会默认生成一系列的变量 array_n1...因此下面也能正确工作*/ putarray_n1= array_c1=; arrayarray_cx [3] $ 2;/*定义为字符型,宽度为2*/ array_cx[1]='ABC'; array_cx[2]='BC'; array_cx[3]='CD'; putarray_cx[1]=; /*长度发生截断,输出 AB*/ run; 与传统的 C/C++ 语言不同,我们也可以人为指定数组元素变量的名字,比如: arraymyarray [3] var1-var3; /*系统默认为 myarray[1]… myarray[3] 生成变量var1 … var3*/ 当然,我们指定的数组长度 3 必须与后面指定的维定义变量列表 var1-var3 的元素数量匹配,否则会报语法错误: ERROR: 为数组myarray 指定的维定义的变量过多。 ERROR: 为数组myarray 指定的维定义的变量过少。 既然我们已经在变量列表 var1-var3 指定了数组长度为3,我们就可以不显式指定数组长度了,而是使用 * 来指定、或者忽略掉数组长度定义: arraymyarray1 [*] var1-var3; arraymyarray2 var1-var3; 注意:虽然上面的代码创建了2个数组 myarray1 和 myarray2,其实他们对应的变量都是 var1,var2 和 var3。这体现了 SAS 数组是变量的组织方式这一本质。 在数组元素变量列表后,我们也可以指定数组的初始值。比如: arraymyarray[3] $ 4var1-var3 ('ABCD','BCDE','CDEF'); 注意:C/C++ 使用大括号 {} 来包含数组元素,而 SAS 使用 () 来初始化数组元素。 为了理解 SAS 数组的运行机制,请运行如下代码: datamydata; arraymyarray[3] $ 4var1-var3 ('ABCD','BCDE','CDEF'); putmyarray[1]; var1="12345";putmyarray[1]; myarray[1]="DEFG";putvar1; run; 系统输出: ABCD 1234 DEFG 上面的结果可以看出,SAS 数组只不过提供了对变量的另一种引用方式,var1 和 myarray[1] 是等价的。 数组名称 一个 SAS 数组必须先定义后使用,而且数组只能在当前 DATA 步内有效。数组命名必须遵循如下规则: 数组名必须遵循 SAS 变量名命名规则,且最长不得超过32个字符。 数组名不得与同一 DATA 步内的其他任何变量名冲突。 数组名应避免与 SAS 系统函数/用户自定义函数重名;否则该名称会被优先当作数组名处理,从而阻碍了用户本来期望的函数调用。 数组定义和引用可以使用方括号[] 、也可使用括号 () 或者大括号 {};由于大括号 {} 在其他 SAS 语法元素中不使用,官方推荐使用 {}。但笔者建议还是使用 C/C++ 等各种计算机语言广泛采纳的中括号 [] 。 数组名必须遵循 SAS 变量名命名规则,且最长不得超过32个字符。 数组名不得与同一 DATA 步内的其他任何变量名冲突。 数组名应避免与 SAS 系统函数/用户自定义函数重名;否则该名称会被优先当作数组名处理,从而阻碍了用户本来期望的函数调用。 数组定义和引用可以使用方括号[] 、也可使用括号 () 或者大括号 {};由于大括号 {} 在其他 SAS 语法元素中不使用,官方推荐使用 {}。但笔者建议还是使用 C/C++ 等各种计算机语言广泛采纳的中括号 [] 。 数组元素变量列表 在定义数组元素变量列表时,可用以下3个之一的特殊变量来将 PDV 中的一系列变量组织到数组定义中。 _NUMERIC_ 将所有的数值型变量当作该数组的元素 _CHARACTER_ 将所有的字符型变量当作该数组的元素 _ALL_ 将所有变量当作该数组的元素 _NUMERIC_ 将所有的数值型变量当作该数组的元素 _CHARACTER_ 将所有的字符型变量当作该数组的元素 _ALL_ 将所有变量当作该数组的元素 比如: data_null_; setsashelp.class; arrayarray_c [*] _CHARACTER_; putarray_c[1] "= "array_c[2]; run; 系统输出: Alfred = M Alice = F … … William = M 数组长度 数组长度是指数组中的元素个数,其下标可以是整型数值、返回整型数值的表达式、或者 * 号。数组长度必须被被 [] 或者() 或 {} 括起来。 注意:数组最大长度不是32767,而是取决于 SAS 运行环境的内存。笔者在自己的环境上尝试过2^22-1 (4194303 约400万) 没有任何问题,而2^23-1 (8388607 约800万) 时仍然只报告系统内存不足,没有任何语法错误。 数组下标默认是从 1 开始的,而不像 C/C++ 或 Java 是从0开始的。可以使用系统函数 DIM 来返回数组的长度: doi = 1toDIM(myarray); putmyarray{i}; end; 用户可以自定义下标区间,但一般情况下下我们推荐使用自然索引。 arraymyarray [2:4] $ 4var2-var4 ('ABCD','BCDE','CDEF'); 通过运行如下代码,可以看到数组在程序数据向量(PDV)中的情况: datamydata; arraymyarray [2:4] $ 4var2-var4 ('ABCD','BCDE','CDEF'); put_all_; run; 系统输出: var2=ABCD var3=BCDE var4=CDEF _ERROR_=0 _N_=1 隐式数组下标变量 在定义数组长度时除了使用常量、返回常量的表达式、常量区间以及星号 * 外,我们也可以指定一个变量,称为下标变量。这种方式只能使用括号来定义数组下标变量,而且数组只能被该下标变量进行引用、或者使用 DO-OVER 语句来引用。其格式如下: array数组名称 (索引变量名) 变量列表; 比如下面的代码: data_null_; /*如果指定 i 作为下标变量*/ arraymyarray (i) $ x1-x3 ('ABCD','BCDE','CDEF'); *put myarray[1]=;/*显式下标索引不再可用*/ /*我们只能使用该变量 i 作为索引,如果使用其他的 i 都会报告错误*/ doi=1to3; puti myarray; end; /*也可完全使用隐性方式*/ doovermyarray; puti myarray; end; run; 系统输出: 1 ABCD 2 BCDE 3 CDEF 1 ABCD 2 BCDE 3 CDEF 注意:这种数组引用方式是 SAS 早期版本支持隐含数组定义的一种方式,现在已经不太推荐使用,但 SAS 代码为了向下兼容保留了该语法。 多维数组 如果数组有2个以上的维度,我们称为多维数组,其定义形式如下: arraymyarray [数组长度1, 数组长度2] x1-x4y4-y4; 比如一个产品销售历史情况表: 定义一个2行X 4列的二维数组: arraymyarray [2, 4] FURNITURE 1-FURNITURE 4 OFFICE1-OFFICE4; 然后可以按照 myarray [1,3] 方式引用数组元素,比如第1行第3列的3000 : 完整的代码如下: datamydata; arraymyarray {2, 4}FURNITURE1-FURNITURE4 OFFICE1-OFFICE4 (1000, 2000, 3000, 4000, 1500, 2500, 3500, 4500); i=1; dowhile(i |
CopyRight 2018-2019 实验室设备网 版权所有 |