欢迎光临散文网 会员登陆 & 注册

如何计算vlm中变量的实际最大长度—非泛用

2022-03-04 13:48 作者:CDISC与SAS  | 我要投稿


        以上是从P21跑出来的excel spec,暂且不考虑CO和TS出现spilt variables不放进supp的情况。我们需要根据Description来计算Dataset中某个variable的length。        今天介绍的方法并不是直接处理P21 export的excel spec,所以程序并不泛用,之后会介绍直接处理excel spec的泛用方法。        下图是我司vlm文件截图,可以根据上图自行解析下图每个column意思,在此不作解释。

        SAS要求字符型加引号才可识别,WhereValue中如果是同属同一变量,用逗号分隔,再根据comparator得出计算符号,即RDOMAIN IN (“PC”,”IS”)。而不同属则如下图,以分号分隔,即LBTESTCD EQ ”GLUC” and LBCAT EQ ”URINALYSIS”。为了给WhereValue里value加上引号的所以我们最好用正则表达式解决问题。

        WhereValue=prxchange(‘s/\b([^,;]*)\b/”$1” /’,-1,WhereValue);        简而言之,抓取除逗号和分号以外任何字符,并加上冒号。见下图。

        下一步操作就是把variable和value组合成SAS可读的语句。可以把vlm中每条观测的variable/comparator/value做成宏变量,        Call symputx (’var’||cats(_n_),variable) ;        Call symputx (’com’||cats(_n_),comparator) ;        Call symputx (’val’||cats(_n_),value) ;        再读取variable/comparator/value中分号的数量,便于把每个变量及其对应的计算符号还有值组合成 if 的筛选语句再单独做成宏变量。        Call symputx (‘n’||cats(_n_), count(variable, ”;”));        下图scan可灵活使用单引号处理带双引号的数据,比如scan('"hi"',1,""),%bquote可省去。

         如果同属同一变量则做一次 if 语句即可,比如if RDOMAIN IN (“PC”,”IS”)。但如果不同属,因为多条独立的 if 语句和单条 if 语句中的多条and是对等的,所以做循环即可。比如if LBTESTCD EQ (“GLUC”); if LBCAT EQ (“CHEMISTRY”);。

        最终得到符合条件的可直接max length的数据集。        另外最后在set众多数据集时,可使用proc append进行多数据集set。




总结:          P21的excel spec如果是在supp中,vlm的长度并不是真实的最大长度,我们需要人工check并且修改填补,所以编写macro是能节省时间提高效率的最好方法。        VLM是人为决定是否给该变量增添vlm,所以与结合数据集以及vlm/ct/spec从而使P21 export的excel spec不同的是,我司vlm文件并不会把spilt变量写进去,因为预先并不知道free text会产生多少个大于200 char的变量,因此在此macro之前,我还写了一段根据实际spilt变量自动output成类似下图的程序(当然公司有专门的程序)。然后就是重复上文步骤。

        以上是根据公司的实际情况进行的处理。

          泛用方法就是直接在P21 export的excel spec中处理,如果是SAS就是运用正则把Description变成SAS可读语句,即IN/EQ/NOTIN/NE等运算符后的value加上引号,再把整个Description当成筛选语句。此正则表达式之后分享。

       如有问题,欢迎私信,一起讨论交流!wx:Terhing


如何计算vlm中变量的实际最大长度—非泛用的评论 (共 条)

分享到微博请遵守国家法律