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、lucyhanmei。                                                                array student{3} lily lucy hanmei ;

 

使用数组名引用变量时,student{1}是变量lilystudent{2}是lucystudent{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;

 

 

 

 

  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值