SAS 数字信息与长度

SAS Numeric Informat vs Length

我正在尝试确定 SAS 如何读取 length 语句,然后再读取 informat 语句。我可能是误会了,但我的印象是 informat 数值变量的语句是这样工作的:

informat number 5.;

这会给变量 number informat 5,允许 5 个数字填充它。例如。 12345

但是,当我 运行 下面的程序时,我有一个有 9 位数字的数字 987654321,其长度适合数字 6,它将代表所有数字直到 137,438,953,472

问:length语句'overriding'是informat语句并允许全部9位填充变量number吗? informat 为 5.?

的变量 number 如何能够容纳所有 9 位数字?
data tst;
input number;
length number 6;
informat number 5.;
datalines;
987654321
;
run;

proc print data=tst;
run;

基于此 SAS 文档: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000199348.htm

w specifies the width of the input field. Range: 1-32

似乎 informat w.d 会像我第一次描述的那样工作,并且不允许所有 9 位数字都填写 number

一个变量的长度定义了该值在存储到磁盘时占用的space量。 注意:在 运行 DATA 步中,所有数字都是双精度的,长度小于 8 的截断仅发生在输出媒体期间。

informat 是一个独立于 length 的概念。 Informat 定义了如何将传入值表示解释为 SAS 数值进行存储。输入值表示将是必须处理的文本;无论是读取文件的 INPUT 语句、处理输入值的 VIEWTABLE 字段编辑、EG 网格单元格编辑等...

格式 是类似的独立概念,它定义了 SAS 如何为输出呈现数值;无论是 PUT 语句、VIEWTABLE 行渲染、PROCs 输出中的位置、EG 网格单元等...

说明

现在已经不在了,当在 INPUT 语句中明确声明时,信息格式将受到尊重:

data _null_;
  attrib number length=6 informat=5.;
  input number 5.;
  put 'NOTE: ' number=;
  datalines;
987654321
run;
===== LOG ===== 
NOTE: number=98765

并且,如您所问,未应用变量关联信息,未说明显式数字信息

data _null_;
  attrib number length=6 informat=5.;
  input number;
  put 'NOTE: ' number=;
datalines;
987654321
run;
===== LOG =====
NOTE: number=987654321

所以第一个是指定格式的 LIST 输入,第二个是 简单 LIST 输入(因为没有指定格式)。

简单的列表输入会接受一些大得离谱的数据,结果值虽然尾端不精确,但会处于正确的指数水平。

data _null_;
  attrib number length=6 informat=5.;
  input number;
  put 'NOTE: ' number= ;
datalines;
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
run;
===== LOG =====
NOTE: number=1.2345679E89

INPUT 语句,List 的文档怎么说?当然,当 none 指示

时, 使用声明信息的变量毫无意义

Simple List Input

Simple list input places several restrictions on the type of data that the INPUT statement can read:

• By default, at least one blank must separate the input values. Use the DLM= or DLMSTR= option or the DSD option in the INFILE statement to specify a delimiter other than a blank.

• Represent each missing value with a period, not a blank, or two adjacent delimiters.

• Character input values cannot be longer than 8 bytes unless the variable is given a longer length in an earlier LENGTH, ATTRIB, or INFORMAT statement.

• Character values cannot contain embedded blanks unless you change the delimiter.

• Data must be in standard numeric or character format. (footnote 1)

FOOTNOTE 1: See SAS Language Reference: Concepts for the information about standard and nonstandard data values. (my LOL)

"SAS Variable Attributes" 状态的概念

informat

refers to the instructions that SAS uses when reading data values. If no informat is specified, the default informat is w.d for a numeric variable, and $w. for a character variable. You can assign SAS informats to a variable in the INFORMAT or ATTRIB statement. You can use the FORMAT procedure to create your own informat for a variable.

(我的粗体)

显然没有明确的默认值,例如 32 或 best32。因为超过32位的值会被无误地输入。

文档有说明吗?是的,有点。收获是什么:

  • 人类直觉在简单列表输入期间继承其信息的数字变量实际不一致实施的行为
    • 现有 SAS 代码的构造数量意味着改变以实现这种直觉的可能性很小
  • 简单的陈述可能涉及大量概念和广泛的文档
  • 可能的更改是更新文档以更明确地说明简单列表输入注意事项

首先:length 不会覆盖或影响信息或读入。 length 仅描述用于存储数字的字节数,仅此而已。

对于数字变量,信息格式不是很直观。我不确定为什么 - 但他们没有。

请参阅 list input documentation 中的这段引文:

For a character variable, this format modifier reads the value from the next non-blank column until the pointer reaches the next blank column, the defined length of the variable, or the end of the data line, whichever comes first. For a numeric variable, this format modifier reads the value from the next non-blank column until the pointer reaches the next blank column or the end of the data line, whichever comes first.

他们确实在某种程度上听取了信息格式——在那里添加一个 .2,你会得到一个强制小数点——但他们不听取要读入的值的长度.我不确定为什么;他们应该这样做似乎很直观,但他们没有。

这是字符变量 - 它们尊重长度但也忽略信息:

data tst;
length number ;
informat number .;
input number;
datalines;
987654321
;
run;

proc print data=tst;
run;

尽管您确实需要将信息格式 放在输入语句 之前(以及数字变量的长度)。

可在 documentation page for INFORMAT 上获得更多详细信息:

How SAS Treats Variables When You Assign Informats with the INFORMAT Statement

Informats that are associated with variables by using the INFORMAT statement behave like informats that are used with modified list input. SAS reads the variables by using the scanning feature of list input, but applies the informat.

In modified list input, SAS does not use the value of w in an informat to specify column positions or input field widths in an external file uses the value of w in an informat to specify the length of previously undefined character variables ignores the value of w in numeric informats uses the value of d in an informat in the same way it usually does for numeric informats treats blanks that are embedded as input data as delimiters unless you change their status with a DLM= or DLMSTR= option specification in an INFILE statement.

关于 SAS 忽略 w 的值这一事实更加明确。

因为您使用的是列表模式输入。在那种情况下,SAS 会读取下一个单词,无论它有多长。基本上在列表模式输入中(包括在 input 语句中指定的信息格式之前使用 : 修饰符时)信息格式的宽度被忽略。

除了在 SAS 数据集中创建元数据之外,将 5.. 等信息附加到变量没有太大价值。

  • SAS 不需要他们了解如何将文本转换为值,这与 date. 等信息格式不同。
  • 在列表模式下它忽略宽度部分。
  • 并且在格式化输入中,宽度很重要,您必须在 INPUT 语句本身中指定信息格式。