不管是SDTM、ADaM,还是TFL,最后的比对都是通过数据集的比较来实现的。这个比较的过程不同的公司可能有不同的称呼,有的叫Validation,有的叫QualityControl。
比对的主体内容是,是数据集的比对,这个实现这个功能的过程步是Compare。不同的公司可能有各自的比较的宏程序,但是程序的核心还是Compare过程步。
我常用的Compare语句如下:
proc compare base = base comp = comp out=df outbase outcomp outdif outnoequal;
run;
下面详细介绍一下代码实现的功能。
1. Compare输出要求
个人编程的习惯是,自己先用简单的Compare过程步进行比较,完全对上之后,再运行公司的比较宏程序。之所以这样做,主要有两个原因,第一,公司宏输出内容内容臃肿,没自己写的Compare语句简洁;第二,在臃肿的宏程序中,没有找到输出自己想要的比对结果的选项。
我想要的输出比较结果实现以下几点:
- 比较结果输出到数据集中;
- 结果数据集中,要包含Base和Compare数据集的记录;
- 结果数据集中,未对上的记录要有标记。
- 结果数据集中,只输出对不上的记录,不输出对上的记录;
2. SAS默认输出结果
大家应该都有体会,SAS自动输出的Compare过程步结果,只成对输出未比对上的结果;同时输出的变量长度只有20,超出20的部分无法展示。这对于QC是很不方便的,我用代码给大家展示一下默认的输出结果:
data base;
a = repeat("1234567890",3); b = "AA"; c=1; output;
a = "Haha"; b = "BB"; c=11; output;
a = "Heihei"; b = "CC"; c=233; output;
run;
data comp;
a = repeat("1234567890",2); b = "AA"; c=1; output;
a = "Haha"; b = "BB"; c=22; output;
a = "Heihei"; b = "CC"; c=233; output;
run;
proc compare base = base comp = comp;
run;
从结果上看,没对上的字符变量,会输出前20位字符,如果长度超过20部分没有对上,就无法直观地查看,这时候需要手动把对应的记录中变量的具体值找出来,复制粘贴到编辑器中进行查看比较;没对上的数值变量会输出不同数值的差值。
3. 实现想要的输出要求
想要实现前面提到的4个输出结果要求,需要使用5个对应Compare过程步选项:
OUT = SAS-data-set
OUTBASE
OUTCOMP
OUTDIF
OUTNOEQUAL
3.1 选项OUT = SAS-data-set
、OUTBASE
、OUTCOMP
OUT = SAS-data-set
选项输出Compare过程步的结果到数据集中;OUTBASE
选项使得在结果数据集中,输出Base数据集的记录;OUTCOMP
选项使得在结果数据集中,输出Compare数据集的记录。
我们可以先看一下这3个选项的输出结果:
proc compare base = base comp = comp out=df outbase outcomp;
run;
这3个选项将Base和Compare数据集中的记录,全都输出到结果数据集中。同时,两个数据集中相同行数的记录是上下排列的,这样可以直观地进行查看。
3.2 选项OUTDIF
选项OUTDIF
会将比较结果显示出来,对于字符变量,对上部分会显示.
,未对上部分会显示X
;对于数值变量,对上部分会显示0
或E
,未对上部分会显示数值的差值。
proc compare base = base comp = comp out=df outbase outcomp outdif;
run;
对于未对上字符变量,X
看起来比较醒目,方便进行比较。
3.3 选项OUTNOEQUAL
从上面输出结果可以看到,第3条记录,是完全对上的,展示出来显得多余。选项OUTNOEQUAL
可以不输出对上的记录,更方便聚焦没有对上的记录。
proc compare base = base comp = comp out=df outbase outcomp outdif outnoequal;
run;
以上,就是我QC过程中,常用Compare选项展示。
4. 大观测数数据集的比对
以上Compare过程步的输出结果,在小数据量的比较中是比较方便QC操作的。但是对于大数据量的比较,比如SDTM.LB,成千上万条数据,即便像上面那样输出,也是不容易一下子上手QC的。这时候,聚焦到未对上的一小部分记录,QC过程就简单多了。
%macro con;
where usubjid = "XXXXX";
keep usubjid lbtest: lborres lbstres:;
%mend;
data base;
set sdtm.lb;
%con;
run;
data comp;
set lb;
%con;
run;
proc compare base = base comp = comp out=df outbase outcomp outdif outnoequal;
run;
以上程序,把比对的数据集进行筛选,聚焦小部分的记录和变量,进行QC,逐个逐个解决问题。
程序中,筛选条件放到宏程序里,这样每次只要修改宏程序中的条件,就可以完成Base和Compare数据集记录的筛选,简化操作。
总结
这篇文章介绍了,Compare过程步的实用选项,方便数据集QC的处理。对于大数据量的比对,未对上时,可以选择筛选数据、缩小比对范围,使得QC过程易于下手。
感谢阅读!若有疑问,欢迎评论区交流!