数组是一组以特殊顺序排列并由数组名标识的SAS变量。只要一组变量名都是同一类型,例如都是数字型或字符型,就可以为该组变量定义一个数组。这些变量可以是数据集中已经存在的,也可以是要创建的新变量。数组仅仅在当前DATA步中存在,在同一DATA步中,数组按名字区分。SAS数组不是一种数据结构,只是临时标识一组变量较方便的方法,在这点上SAS数组不同于其他编程语言中的数组。
一、引用和定义:
在DATA步中使用ARRAY语句定义数组。定义数组的基本形式如下:
array 数组名 {下标} <$><长度><数组元素><(初始值列表)>;
:
-
数组名:指定数组的名称。该数组名在同一DATA步中不能与任何其他变量名或关键字重名。其命名需遵循SAS变量的命名规范(不超过32个字符,以字母或下划线开始,可包含字母、数字和下划线)。
-
下标:下标可以有多种形式,通常为指定数组元素个数、上下边界或*。*表示通过计算数组元素个数确定数组下标。
-
$:$指定数组中的元素是字符元素。如果数组元素是数字元素或先前已经定义的字符元素,则不需要使用$。
-
长度:长度指定先前未指定长度的元素的长度。
-
数组元素:数组元素指定组成数组的元素名称。
-
初始值列表:初始值列表给出数组中对应元素的初始值,以空格隔开。
定义数组时的括号可以是()、{}或[]。定义数组时的下标形式指定了数组维度、各个维度的下边界和上边界。还可以通过不同格式的下标指定多维数组,多个维度之间用逗号(,)分隔,同一个维度内的上下边界使用冒号(:)分隔
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
数组元素可以是数字型或字符型,并且可以以任何顺序列出,其个数必须等于括号{}中给出的下标值。
数组元素可以是已经存在的变量或不存在的变量,当数组元素是不存在的变量时,SAS会创建新变量。除了列出变量外,变量可以是关键字_NUMERIC_、_CHARACTER_或_ALL_,其说明如下表所示。
数组定义中使用_NUMERIC_、_CHARACTER_或_ALL_
数组定义 | 说明 |
Array num{*} _NUMERIC_; | 定义数组num,其元素包含所有数字型变量 |
Array char_var{*} _CHARACTER_; | 定义数组char_var,其元素包含所有字符型变量。 |
Array all_var{*} _CHARACTER_; | 定义数组all_var,其元素包含所有变量,要求所有变量必须是同一类型。 |
还可使用关键字_TEMPORARY_来创建临时数据元素。临时数据元素不会出现在输出数据集中,并且其值总是自动保持,而不会在DATA步的每次迭代开始时自动设置为缺失值。临时数组元素仅用于计算,如果要保留计算结果,需要将结果赋值给其他变量。使用临时数组元素的好处是会提高性能。
要使用数组名引用变量时,给出数组名和该变量的下标。例如,使用如下ARRAY语句定义变量student,共3个元素,分别为变量lily、lucy和hanmei。 array student{3} lily lucy hanmei ;
使用数组名引用变量时,student{1}是变量lily,student{2}是lucy,student{3}是hanmei。
如果定义数组时指定了上下边界,例如:
array months{4:6} April May June ;
则Months{4}是变量April,Months{5}是变量May,Months{6}是变量June。
举个常用的例子:
一、sas批量处理缺失值或特定值:
(以下例子是对数据集TMP的数值性字段为缺失值和<-999的批量赋值为-9999999;对字符字段缺失值统一赋值“-9999999”);
DATA TMP1;
SET TMP;
ARRAY NUM_V _NUMERIC_;
DO OVER NUM_V;
IF MISSING(NUM_V) OR NUM_V<-999 THEN NUM_V=-9999999;
END;
ARRAY CHAR _CHAR_;
DO OVER CHAR;
IF MISSING(CHAR) THEN CHAR="-9999999";
END;
RUN;
二、批量更改数据类型(把tmp中字符型字段批量变成数值型)
data _NULL_;
set tmp;
array tmp[*] _character_;
call symputx("nvar",dim(tmp));
run;
data tmp1;
set tmp end=eof;
array tmp[*] _character_;
length vars $32767.;
retain vars "";
array num[&nvar.];
do i=1 to dim(tmp);
num[i] = input (tmp[i],best12.);
if eof then vars=catx(" ",vars,cats(vname(num[i]),"=",vname(tmp[i])));
end;
if eof then call symputx("vars",vars);
drop _character_ i;
run;
%put &vars.;
data last;
set tmp1;
rename &vars.;
run;