sas 数组简介,sas数组批量处理缺失值和批量更改数据类型例子
数组是一组以特殊顺序排列并由数组名标识的SAS变量。只要一组变量名都是同一类型,例如都是数字型或字符型,就可以为该组变量定义一个数组。这些变量可以是数据集中已经存在的,也可以是要创建的新变量。数组仅仅在当前DATA步中存在,在同一DATA步中,数组按名字区分。SAS数组不是一种数据结构,只是临时标识一组变量较方便的方法,在这点上SAS数组不同于其他编程语言中的数组。
一、引用和定义:
在DATA步中使用ARRAY语句定义数组。定义数组的基本形式如下:
array 数组名 {下标} <$><长度><数组元素><(初始值列表)>;
数组名:指定数组的名称。该数组名在同一DATA步中不能与任何其他变量名或关键字重名。其命名需遵循SAS变量的命名规范(不超过32个字符,以字母或下划线开始,可包含字母、数字和下划线)。
下标:下标可以有多种形式,通常为指定数组元素个数、上下边界或*。*表示通过计算数组元素个数确定数组下标。 $:$指定数组中的元素是字符元素。如果数组元素是数字元素或先前已经定义的字符元素,则不需要使用$。 长度:长度指定先前未指定长度的元素的长度。 数组元素:数组元素指定组成数组的元素名称。 初始值列表:初始值列表给出数组中对应元素的初始值,以空格隔开。
定义数组时的括号可以是()、{}或[]。定义数组时的下标形式指定了数组维度、各个维度的下边界和上边界。还可以通过不同格式的下标指定多维数组,多个维度之间用逗号(,)分隔,同一个维度内的上下边界使用冒号(:)分隔
数组定义 维度 上边界 下边界
Array Y {4}a b c d ; 1 1 4
Array Y {0:5}a b c d e; 1 0 5
Array Y {*}a b c d e; 1 1 5
Array Y {2,11:15}a1-a10; 2 第一维:1第二维:11 第一维:2第二维:15
数组元素可以是数字型或字符型,并且可以以任何顺序列出,其个数必须等于括号{}中给出的下标值。
数组元素可以是已经存在的变量或不存在的变量,当数组元素是不存在的变量时,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;
————————————————
版权声明:本文为CSDN博主「暮雨听轩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013817846/article/details/78104607

浙公网安备 33010602011771号