SAS长度语句

SAS长度语句,sas,Sas,我刚刚意识到减少数值(假人和整数)变量的长度是多么有用,因为它既节省了我的时间又节省了磁盘空间。然而,我认为在我的代码末尾使用length语句比在提到“set”之前更方便(后一种方式是SAS博客和其他专家推荐您使用length语句的方式) 那么,这两种方法之间有区别吗(见下面的例子)?我在输出中找不到任何差异,但我有点担心我可能做错了什么。你能解释一下区别是什么(如果有区别的话)以及为什么你更喜欢用这两种方式 提前谢谢 这是如何使用length语句的示例: data b; set a; d

我刚刚意识到减少数值(假人和整数)变量的长度是多么有用,因为它既节省了我的时间又节省了磁盘空间。然而,我认为在我的代码末尾使用length语句比在提到“set”之前更方便(后一种方式是SAS博客和其他专家推荐您使用length语句的方式)

那么,这两种方法之间有区别吗(见下面的例子)?我在输出中找不到任何差异,但我有点担心我可能做错了什么。你能解释一下区别是什么(如果有区别的话)以及为什么你更喜欢用这两种方式

提前谢谢

这是如何使用length语句的示例:

data b;  
set a;

dummy = income > 10 000;

label "dummy = Income > 10 000";

length dummy 3;

run;
但专家建议您这样做。

data b;  
length dummy 3;  
set a;

dummy = income > 10 000;

label "dummy = Income > 10 000";

run;

我敢发誓,在以前版本的SAS中,一旦由length语句定义或从源数据“继承”,就不能重写变量的长度

我记得一些关于“变量长度……已设置”的注释或警告

在SAS 9.3中,代码:

data a;
    length income dummy 8.;
    income = 1234567890;
    dummy = 1234567890;
    output;
    stop;
run;

data b;  
    set a;
    attrib dummy length = 3 label = "dummy = Income > 10 000";

    dummy = income > 10000;
    length dummy 8;
    length dummy 5;
run;
创建长度为5的变量虚拟对象,不带任何注释。 所以在我看来,这种行为已经改变了。在前面,我想说的是,最终会得到一个变量,该变量由源数据中的第一个显式定义或外观定义

然而,首先为变量赋值并在最后定义变量的基本属性肯定无助于代码的可读性和可维护性

顺便说一句,标签的正确定义是:
label dummy=“dummy=Income>10000”

或者,您可能更喜欢
ATTRIB
语句来指定单个语句中单个变量的各种属性

data b;  
    set a (drop = dummy);
    attrib dummy length = 3 label = "dummy = Income > 10 000";

    dummy = income > 10000;

run;

数值变量的长度可以随时更改,而字符变量只能在创建之前更改。这是因为数值变量的长度只影响输出数据集;在PDV内部,无论语句的长度如何,数值变量的精度始终为8字节。但是,字符变量的长度可能没有重新定义,因为与字符变量关联的PDV长度在最初定义后(在set语句或字符变量的第一个长度/attrib/赋值中)是不可替换的。有关更多详细信息,请参阅上的文档(尽管没有我希望看到的那么多)


也就是说,我个人更喜欢前面的格式和长度,而不是结尾。部分原因是,任何阅读该程序的人都知道最终的格式是什么;但大多数情况下,某些长度/属性必须提前完成:特别是字符长度,以及任何需要提前指定类型(数字/字符)的变量,以确保最终使用正确的类型。如果你通常把长度放在末尾,你会得到一些在前面/一些在末尾的混合体,因此我宁愿在前面做所有的事情,以便更有条理。

可能不是这样的,在
length
语句之前,
dummy
的值可能被分配了一些很大的长度?首先在
length
语句被裁剪之后。导致堆碎片等。@JoopEggen(如我在回答中所述)SAS数值变量在计算过程中总是正好是8字节;数字长度仅影响存储空间,并且不能超过8字节。SAS是4GL,在让您犯这样的错误方面与C甚至R完全不同。缩短长度可能会节省I/O(读/写)时间,但会增加CPU时间,因为需要将PDV处理转换为长度8。我很高兴听到这两种选择似乎都是正确的。感谢您提及attrib声明,我以前从未听说过。感谢您分享您的知识。我现在意识到,只在前面使用长度陈述可能是明智的。