美文网首页
SAS 程序冷知识——length在设定字符长度时的缺陷

SAS 程序冷知识——length在设定字符长度时的缺陷

作者: 生物统计与SAS研究员 | 来源:发表于2023-07-22 15:50 被阅读0次

    我们经常使用length语句来设定一个字符型变量的长度。但这个做法是有缺陷的。

    图中merge的两个数据集中存在一个名为usubjid的变量,该变量是rawdata中给的,内容不是sdtm的usubjid,仅仅是同名而已。因此我需要从新给该变量赋值。但因为原变量长度比较小,只有$6,所以我需要在merge前声明长度防止截断。但有趣的是这段代码的结果为:

    我们发现,length的确是200了,但informat和format还是$6,结果不出意外的被截断了。

    这个涉及到length,informat和format的区别。format相当于数据的外衣,底层存储的数据不变,不同format只是展示的方式不同。informat是读入数据的方式,不同informat,导致读入的底层数据不同。比如我们读入的目标是这样一段内容“20220208”,如果选择使用$8这个information,读入的就是一段8个字符长度的字符串。如果使用best这个informat,读入的是两千多万的数值。如果用yymmdd8这个informat,那么读入的是一个代表日期的数值。

    一般来说当代码中变量是一个新增变量,length,informat,format往往是一致的,你读入一个另两个自动一致。所以当我们用length时,你虽然没有设定informat和format,但sas会自动按照length设定。

    但我以上这个例子则不同,当我设定了length,sas在随后读入all这个数据集,并在随后读到了相同的变量usubjid,由于length已经在之前设定了,所以依然是200,但由于此时informat和format还是空的,所以这两个会变成$6。

    为了解决这个问题,我将length改为了informat,结果如下:

    从结果来看,length会被informat决定,也就是说尽管我没有事前定义length,但因为informat被定义为200,所以length并没有受到all中参数的影响。我想sas内部应该有个规则——length不能低于informat的长度。

    总之,在今后的工作中,建议不再使用length规定变量长度,直接使用informat会更好,因为informat可以同时保证length,而length无法保证informat。

    相关文章

      网友评论

          本文标题:SAS 程序冷知识——length在设定字符长度时的缺陷

          本文链接:https://www.haomeiwen.com/subject/yvpxpdtx.html