Sas 这个变量(IF语句)的长度是多少

Sas 这个变量(IF语句)的长度是多少,sas,Sas,代码如下: data test; set sasdata.chemist(keep=job_code); if job_code = 'chem3' then description = 'Senior Chemist'; run; 变量job_code是长度为6字节的字符变量。那么,输出数据集中变量描述的长度是多少?据我所知,description变量仍然缺失,因为if语句的计算结果为false。所以,长度是0。但正确答案是14字节。为什么是14岁?谁能给我解释一下吗?非常

代码如下:

data test;
   set sasdata.chemist(keep=job_code);
   if job_code = 'chem3'
   then description = 'Senior Chemist';
run;
变量job_code是长度为6字节的字符变量。那么,输出数据集中变量描述的长度是多少?据我所知,description变量仍然缺失,因为if语句的计算结果为false。所以,长度是0。但正确答案是14字节。为什么是14岁?谁能给我解释一下吗?非常感谢您的时间和关注

编辑: 由于以下代码也与变量的长度有关,因此将其放在一起是有意义的

data work.test;
  Author = 'Agatha Christie';
  First = substr(scan(author, 1, ','),1,1);
run;
根据答案表,变量“First”的长度是200。据我所知,可变长度是在编译时确定的。不过,为什么是200?如有任何意见,将不胜感激


另外,有了java、python、r和matlab的经验,我发现SAS和其他软件相比有点奇怪。我真的很感激你的评论,不管是什么。当然,我特别感谢所有的鼓励,这些鼓励确实让我的一天变得光明。我会多读一些,尽量不要问一些琐碎的问题

SAS将尽快定义变量的类型和长度。它将根据您对它看到的代码的意思的最佳猜测来设置长度。它在数据步骤开始执行之前的编译过程中执行此操作

在您的情况下,对
描述的第一次引用是在赋值语句中。因为它被分配了一个14字节长的字符串,所以它将变量定义为长度为14的字符

job\u code
的第一个引用在
SET
语句中。SAS将创建
job\u code
,以匹配它在源数据集中的定义方式。这就是为什么它被定义为长度6,而不是被定义为长度5,以匹配
'chem3'
的长度

如果变量的第一个引用是字符函数结果的赋值,则SAS通常默认为长度$200

如果您想确定变量是如何定义的,那么在其他语句中使用它们之前,请使用
LENGTH
ATTRIB
语句来明确定义它们

您似乎还混淆了变量特定值的长度和定义的变量最大长度。SAS将字符变量存储为固定长度。当你谈论一个变量的长度时,通常指的是这个定义的最大长度。为变量指定较短的值时,会用空格填充该变量以填充空格


可以使用
LENGTH()
函数计算存储在字符变量(或字符串文字)中的值的长度。长度是字符串中最后一个非空字符的位置。还请注意,按照惯例,全空字符串的长度为1。如果你喜欢把一个全空字符串考虑为0的长度,你可以使用<代码>长度>(/>代码>函数。

这里也许比汤姆的答案更详细一点。

当SAS进程接收到数据步骤的代码时,它会经历三个不同的阶段

  • 宏解析
  • 汇编
  • 执行
并非在所有实例中都需要宏解析,但它仍然首先检查是否有任何宏标记(带有
%
&
的东西)要解析

然后,它经历了编译阶段。这是SAS计算数据步骤将要执行的操作的地方。在处理任何数据之前,SAS知道:

  • 输入数据集是什么
  • 输出数据集是什么
  • 输入数据集上有哪些变量
  • 在处理过程中,需要在存储数据的位置中定义哪些变量
  • 哪些变量将输出到输出数据集
  • 变量的长度是多少
  • 变量的格式是什么
  • 变量的顺序
。。。还有很多其他的信息。所有这些都是在读取任何数据之前确定的。来自输入数据集的信息在数据集的前几个块中可用(基本上,PROC内容能够生成的任何内容都存储在那里)。在读取任何数据之前,都要先读取,然后再计算

然后读取数据,在执行阶段执行
if
语句之类的操作

这就是为什么不能在IF块中更改变量的长度、保留或删除哪些变量、变量的格式。编译阶段所做的一切都不取决于数据:所有这些都是事先知道的

相反,当SAS在数据步骤中看到一个新变量时,它会立即在PDV中为它创建一个新条目。它查看代码并决定创建代码的时间,给它一个默认格式、标签等。一旦创建了代码(在第一次遇到之后),即使以后再次看到它,它也不会更改这些内容

例如,在本代码中:

data test;
  x="Hello";
  output;
  x="Goodbye";
  output;
run;
您认为
测试中的内容是什么

以下是:

_N_=1 x=Hello
_N_=2 x=Goodb
是的。您丢失了几个字符,因为SAS根据x的第一个实例将其设置为5长。当然,您可以自己定义长度,或者切换这些语句的顺序,得到不同的结果

然后,如果你写:

data test;
  if 0 then x='Hello';
  if 1 then x='Goodbye';
  output;
run;
你现在会得到什么

答案是:

_N_=1 x=GOODB
SAS编译器看到了第一行,即使很明显
如果0
为false,它也不在乎:它仍然会像往常一样做同样的事情。它看到
x='Hello'
,在PDV上生成一个x变量。然后执行阶段出现,它实际处理
if
语句;因此,仅创建/输出第二行。但它仍然只有5长

我建议你读一些书