我们在做table的时候,尤其是lab的descriptive summary。我们通过proc得到一些常见统计量,比如 n, mean, std, median, min, max。一般sap当中会规定小数点位数的保留方法。比如以raw data的最大小数位数为基准,在此基础上, mean会多一位,std会多两位,median, min, max会和raw data的小数位数一样,如果raw data的最大小数位数超过3位的,当2位小数(这样规定的不多)。正常情况下,那我们可以直接写成put(var,8.0), put(var,8.1)...之类的。但像lab这样的,parameter很多,不清楚哪一个parameter的test result value "aval"最大小数到底是多少位,那只能智能化处理了。但一种方法不推荐,甚至说是不允许的。那就是你先写个小程序得出每个parameter maximum decimal,然后这样写: if paramn in (1 2 3) then put...; else if paramn in (4 5 6) then put...; 这样写的话,有被认为是hard-coding之嫌!而这在临床试验的编程工作中,是坚决不允许的,除非客户要求,或者更高层次的批准。
所以,做法肯定是根据paramater来决定它的统计值的输出格式了。当然,不同的人会有不同的编程方法。有的喜欢用宏,先做出宏变量值,在derive的时候用do循环。有的觉得可以不用,直接在data步里面就可以搞定。
这里说句题外话,并不是只要用了宏就觉得逼格很高,甚至宏套宏的,来个一环又一环的。这样并不好,这以后再说。
说了这么多废话,只想引出一个比较重要的函数,那就是PUTN。这个函数的好处是后面的format可以用个字符型的变量表示,这一点太好了!!!网上找了个地址:http://bama.ua.edu/sasv8/sclr/z0320184.htm。感兴趣的朋友可以去看下。
其实,我非常想把自己的code放上来,毕竟变量啊,写法什么的啊,都是follow一些标准的,而且这样多省事啊!可是公司是零容忍类似这样泄露知识产权的行为,公司一波接一波的sop让我们觉得,公司很大很正规,我还是规矩点好。在不确定可不可以这样做的时候,我还是不去尝试。另外,还有一个关键的原因,这个论坛里面高手如云,我不敢放自己的code。
好了,我来说下我的做法。
1. 通过一些类似lengthn, scan之类函数和sort过程,得到每个parameter maximum decimal。然后可以生成三个字符型变量dec0, dec1, dec2。像dec1 = strip(put(8.0+0.1*(maxdec+1),best.))...;
2. 用sql or merge连接。
3. msd=putn(var_mean,dec1) || " (" || strip(putn(var_stddev,dec2)) || ")"...;
这样下来之后,各个统计量就会根据不同的lab test name来选择小数的保留位数了。
tips:
1). 上面用的最大长度是8位,对有些很大的值可能会truncated, 所以,可以用round来处理。
2). 如果变量比较多,可以考虑用macro来简化每个variable derivation。
3). 像这样处理小数位数的,sas programmer是经常碰到的。写一套属于自己的code,以不变应万变最好。
...
over
|