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长
我建议你读一些书