设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6050|回复: 0

SAS 变量(SAS Variables)

[复制链接]

4

主题

47

金钱

72

积分

新手用户

发表于 2018-9-28 11:23:20 | 显示全部楼层 |阅读模式
本帖最后由 ppdz 于 2018-9-28 11:24 编辑

在程序运行期间其值可以改变的量称为变量。变量相当于一个容器,储存着同质对象的值,变量在使用时要定义它的一些属性,如名字、类型、长度、输入及输出格式、标签、变量次序、索引类型等。

1、变量的属性(Variable Attributes)

(1)名字(Names):变量的命名规则参见48.3.2,其长度不超过32 字节。诸如_N_、_ERROR_、_FILE_、_INFILE_、_MSG_、_IORC_、_CMD_等变量是SAS 在程序运行过程中某些特殊语句生成的自动变量,这些变量名以下划线(_)开头和结尾,不能用于用户自定义的变量名。

(2)类型(Type):SAS 中变量类型有两种:数值型(也称为数字型)和字符型(也称为文本型)。字符型变量储存的是字符,可以包括字符、数字0-9 和其他特殊字符,建立变量时在变量后加一个美元符号($)可以将这个变量定义成字符型变量,美元符号($)可以紧跟字符型变量名,中间也可以有空格。如未经特殊定义,SAS 中的变量默认类型为数值型,数值型变量以浮点形式储存数字,有相应的精度,时间和时期变量值也是以浮点数字的形式储存。

(3)长度(Length):指储存变量值的字节数。变量长度默认为8 字节(Byte),1 字节也就是8 位元组,位(Bit)也称为比特,即二进制的0 或1,通常一个英文字母或普通符号需要占用1 个字节,而汉字需要2 个字节。用户可以用Length、Attrib 语句定义和修改变量长度。如果变量第一次出现在表达式左边,则这个变量的长度和表达式右边结果值的长度一致。注意,不要混淆变量名长度和变量(值)长度的概念。

(4)输出格式(Format):指SAS 输出变量的结构。字符型变量的默认输出格式是“BEST16.”,数值型变量的默认格式是“$w.”,可以用Format、Attrib 语句或者Format 过程定义和修改变量的输出格式。

(5)输入格式(Informat):指SAS 读取数据值的结构。字符型变量的默认输出格式是“$w.”,数值型变量的默认格式是“w.d”,可以用Informat、Attrib 语句或者Format 过程定义和修改变量的输入格式。

(6)标签(Label):指变量的描述信息。标签长度不超过256 字节,可以在一些结果中显示出来,方便读者阅读,用Attrib、Label 语句可以定义和修改变量标签。

(7)变量次序(Position in Observation):指数据步创建或定义变量的次序。第1 个创建的变量其变量次序即为1,第2 个创建的变量其变量次序为2,以此类推。这个属性在变量列表的形式中可以用到。

(8)索引类型(Index Type):决定这个变量是否是数据集索引的一部分的属性。这个属性可以用Contents 过程的‘OUT=’选项进行定义和修改。

调用Contents 过程可以显示数据集中变量的属性。例如,在程序SASTJFX48_1 的基础上添加下面一段程序运行后,变量按观测位置排序显示相关信息(如无VarNum 参数,则变量默认按字母顺序排序)。

PROC CONTENTS varnum data=SASTJFX48_1;

RUN;

结果窗口显示数据集属性、引擎/主机相关信息及如下的变量属性信息见表。

按创建时间排序的变量
#变量类型长度
1name字符8
2height数值8
3weight数值8
4BMI数值8

2、建立变量的方法

SAS 中,建立变量的过程也就是定义变量的过程,而且可以在使用变量的同时来定义变量,并不强制要求“先定义,后使用”。

(1)使用赋值语句。在数据步,可以将一个变量放在赋值语句的左边来创建一个新变量,如未经其他语句定义,这个新建变量的长度、类型和赋值语句右边表达式的返回值的长度、类型相同。例如,程序SASTJFX48_1 第7 行是一条赋值语句,等号(=)左边是新建的变量BMI,等号右边是一个表达式,并且变量BMI 在程序中第一次出现,所以变量BMI 和等号右边的表达式结果值具有相同的类型和长度。需要注意的是,如果等号右边的表达式中出现变量,那么变量必须是先前已经定义过的变量。例如,第7 行表达式右边的weight、height 变量在前面已用INPUT 语句进行定义,否则在日志中会显示“变量未被初始化”的提示信息。

(2)使用INPUT 语句。在数据步,可以用INPUT 语句读取原始数据的值,并将读取的数据值赋予INPUT 语句后列出的变量。例如,程序SASTJFX48_1 第6 行用INPUT 语句建立了name、height、weight 三个变量,并从数据行读取数据值赋予相应的变量。

(3)使用Attrib、Length、Format、Informat 语句。在数据步,可以使用这些语句新建变量,并给这些变量指定相应的属性,但用这些语句新建变量时,需要在之前或之后用其他语句对变量进行初始化。

【例】使用Attrib 语句新建变量。下面的程序中用Attrib 新建了变量flavor,并规定了其输出格式,但此前用赋值语句对变量FLAVOR 进行了初始化。

  1. DATA SASTJFX48_2;
  2. Flavor="Cherry";
  3. ATTRIB Flavor format=$10.;
  4. RUN;
复制代码

(4)使用RETAIN 语句。RETAIN 语句为变量赋初值的同时,也定义了变量名、变量类型、长度等属性。例如,RETAIN name ‘Tom’;语句定义了一个名为name 的变量,根据其初值可

知该变量为3 字节的字符型变量。另外,使用FGET()函数也可以建立变量。

3、变量列表(SAS Variable Lists)

SAS 变量列表也称为变量的缩写记号,是以缩写的方式引用多个SAS 变量的方法。SAS 中变量的缩记方式有以下4 种:

(1)数字范围列表。这种方式要求变量名前面部分的名字相同,并且以连续的数字结尾,例如,一系列变量X3、X4、X5、X6,可缩记为X3-X6。这种方式在建立变量和引用变量时都可以使用,使用时并不受变量次序的约束。

【例】以数字范围列表方式缩记多个变量。下面的程序,数据步新建了变量item5、item2、item3、item4、item6,过程步,指定显示变量item3、item4、item5,虽然变量item5先于其他变量建立(即变量次序靠前),但可以用item3-item5 的形式缩记这些变量。

  1. DATA SASTJFX48_3;
  2. INPUT item5 item2-item4 item6 @@;
  3. DATALINES;
  4. 2 3 4 5 6
  5. ;
  6. RUN;
  7. PROC PRINT data=SASTJFX48_3;
  8. VAR item3-item5;
  9. RUN;
复制代码

(2)名字范围列表。这种引用变量的方式要求按变量的变量次序进行缩记,方法是在两个顺次创建的变量名中间加2 个横线(--),并且可以在两个横线中间加入NUMERIC 或CHARACTER 来限定引用的变量为数值型或字符型变量。例如,引用SASTJFX48_1 数据集中的所有变量可以用变量次序为第1 和最后一个变量次序的变量来缩记,其形式为name--bmi,name-numeric-bmi 则指定按照变量次序从name 开始到bmi 结束,其间的所有数值型变量;name-character-bmi,则指定按照变量次序从name 开始到bmi 结束,其间的所有字符型变量。

(3)名字前缀列表。一些函数或语句允许使用名字前缀列表的方式缩记变量,这些变量具有相同的前缀,后缀则是下划线(_)加其他字符。例如,SUM(OF SALES:)语句中,SUM()函数的参数包括以SALES 为前缀的所有变量,如SALES_JAN、SALES_FEB、SALES_MAR 等等。

(4)特殊名字列表。其实是利用自动变量,_ALL_表示数据集中所有变量,_NUMERIC_表示所有数值型变量,_CHARACTER_表示所有字符型变量。

4、变量类型的自动转换

如果变量在使用时的类型和前面语句中定义的类型不符,SAS 会尝试自动转换变量的类型,并在日志窗口显示相关的转换信息。

如果一个已定义为数值型的变量在后面的语句中当作字符型变量来使用,则SAS 按BEST16.格式把这个变量转换为字符型变量,如果在后面的语句中对字符型变量的长度进行了定义,而定义的长度不足以容纳数值型变量值,则转换后的值为星号(*);如果数值型变量的值太小,则转换后的字符型变量值为0。

如果一个已定义为字符型的变量在后面的语句中当作数值型变量来使用,则SAS 会尝试将字符型变量转换为数值型变量,如果不能成功转换,则数值型变量值成为缺失值。

5、数值精度(Numeric Precision)

SAS 以浮点或真二进制数的形式储存所有的数值。浮点形式类似科学记数法形式,科学记数法的形式由尾数、底数和指数组成,是一个0 到1 的数字乘以一个整数(通常是2、10、16等)的幂的形式。例如,0.1234×104 中,0.1234 为尾数,10 为底数,4 为指数。这种储存数值的形式,通过调整底数位数、指数位数来适应高精度运算和大数量级运算等不同场合。大多数情况下,这种储存数值的方法不会影响到用户的使用,但有时用户规定了一个较小的长度用来储存数量级较大的数值,SAS 系统或操作系统可能会将原来的数值四舍五入来储存,改变了原数值的精度,给后续的运算带来误差。

即使不考虑数值精度,一些数值的表现形式也存在问题。例如,用十进制数表示1/3,则这种分数的信息不能被完全表现出来;同样,诸如0.1 等大部分的十进制小数,用2 进制或16 进制的表现形式也存在问题,例如,IBM 主机以下面的形式储存十进制的0.1,

40 19 99 99 99 99 99 99

可以看到拖尾有很多9,这和用0.33333…表示1/3 一样,存在误差。并且这些情况使得经过多次算术运算的数值精度更加糟糕,例如将0.33333…加0.99999…,理论值是1.33333…2,但实际的答案是不可能准确的。

【例】由于数值储存形式,导致计算问题。

  1. DATA SASTJFX48_4;
  2. DO i=-1 TO 1 BY 0.1;
  3. IF i=0 THEN PUT ‘AT ZERO';
  4. END;
  5. RUN;
复制代码

由于十进制小数0.1 的储存是拖尾很多个9 的形式,经过累加的变量i 值只能无限接近0,但永远不能准确的到达0,所以不能执行PUT 语句,“AT ZERO”信息永远不会在日志窗口显示出来。

这种数值的不精确给数值比较也带来了同样问题,通常情况下,在分数的运算和比较中使用ROUND()函数取整来解决这类问题。

SAS 允许以低精度的形式在磁盘上储存数值,使用LENGTH 语句可以改变以浮点形式储存的数值的占用位数。但要注意,在使用LENGTH 语句时不要使有意义的数据信息丢失。例如,数字1234567890 的表示方法可能是0.1234567890 乘以10 的10 次方,如果保留5 位精度,则这个数字可能变成了123460000(由于储存字节数不够,对原数进行了四舍五入)。

所以用LENGTH 语句减少数值储存长度,唯一的理由就是节省磁盘空间。在计算过程中,我们希望所有的数值都有完全的长度。因此一个数值如果不是整数,则一般不要使用LENGTH语句规定其长度,这样做可能会丢失数值精度。

本帖被以下淘专辑推荐:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表