从程序员到数据科学家:SAS 编程基础 (9) 您所在的位置:网站首页 sas数组循环 从程序员到数据科学家:SAS 编程基础 (9)

从程序员到数据科学家:SAS 编程基础 (9)

2023-08-29 05:24| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有