首页 > 其他分享 >PROC COMPARE 使用的一些小技巧

PROC COMPARE 使用的一些小技巧

时间:2024-01-29 10:45:29浏览次数:28  
标签:COMPARE 0000 技巧 PROC compare sysinfo put 数据 变量

在 SAS base 中,PROC COMPARE 可以比较两个数据集的差异,实际工作中常应用在 ADaM 和 TFL 的 QC 中,下面介绍一些 PROC COMPARE 常用的使用技巧。

指定主键

默认情况下,PROC COMPARE 从第一个观测开始,逐行对比两个数据集的观测。在数据集没有增减观测的情况下,这样做一般没有问题。如果两个数据在观测数量上存在差异,PROC COMPARE 的默认比较方式可能会生成大量无用的结果(例如:对 ADSL 进行 QC 时,将受试者 S01047 与 S01048 的观测值进行比较)。

为了避免这种无意义的比较,可以指定数据集的主键,主键是数据库中的一个概念,通过主键可以唯一确定一条观测。PROC COMPARE 的 ID 语句可以指定两个数据集共同的主键,以便根据主键变量的值对数据集进行比较。如果两条观测的主键变量的值不相等,即便它们处于两个数据集的相同位置上,也不会进行比较。例如:

proc compare base = old.adsl compare = new.adsl;
    id usubjid;
run;

对于 subject-level 的数据集,主键是单个变量;对于 param-level 的数据集,主键通常由多个变量复合而成:

proc compare base = old.adlb compare = new.adlb;
    id usubjid parcatn paramn;
run;

上述代码用于比较实验室检查的分析数据集(ADLB),这是一个 param-level 的数据集,主键由变量 subjid, parcatn, paramn 复合而成。

指定变量映射

在进行清单核查时,有时候输出条目太多,手工核查不切实际。一种办法是尝试读取 RTF 文档,将 RTF 文档中的数据逆向转化为数据集,然后使用 PROC COMPARE 对比两个数据集。

由于 RTF 文档本身只包含观测内容和变量标签,而没有变量名,转化为数据集之后,变量名大概率与 QC 程序生成的数据集的变量名不一致(这通常取决于读取 RTF 文档的程序内部逻辑)。如果不指定额外语句,PROC COMPARE 默认仅比较相同变量的值。

在使用 PROC COMPARE 前对变量重命名或许是一种可行的方法,但其实 PROC COMPARE 提供了 VARWITH 语句用于建立两个数据集之间的变量映射关系。VAR 语句指定变量在 base 数据集中的名称,WITH 指定变量在 compare 数据集中的名称。

proc compare base = qc_l2 compare = l2;
    var  usubjid siteid sex age iedt elresn;
    with col1-col6;
run;

这里使用 VARWITH 指定了数据 qc_l2l2 之间的变量映射关系,无需在使用 PROC COMPARE 之前对变量进行重命名操作。

巧用位掩码解析 SYSINFO

位掩码介绍

在 SAS 中,位掩码(bit mask)被归类为一种特殊的常数(constant),通常用于进行比特位的检测。

位掩码由数字 0, 1 和点(.)组成,例如:'1.0000'b,为了与字符串常量区分,这里末尾的 b 是必要的。

在二进制计算机中,所有字符和数字都是以 0 和 1 的二进制形式存储的,每一个 0 和 1 都被称作一个比特。例如:字符 a 的二进制表示是 01100001,数值 36 的二进制表示是 00100100

  • 当位掩码用于字符串的比特位检测时,先将字符串以二进制形式表示出来,然后与位掩码对齐,从左到右逐个检测比特位;
  • 当位掩码用于数值的比特位检测时,先将数值以二进制形式表示出来,然后与位掩码对齐,从右到左逐个检测比特位。

例如:

data _null_;
    a = 36;
    if a = '..1.....'b then put a "的第 3 个比特位是 1 !";
    else put a "的第 3 个比特位是 0 !";
run;

在这个例子,我们只检测数值 36 的第 3 个比特位,不关心其余比特位到底是 0 还是 1,因此,位掩码 '..1.....'b 的第 3 位是 1,其余比特位均为点,表示忽略这一个比特位的检测。

字符的比特位检测也是类似地,只不过字符的二进制形式还与具体的编码格式有关,这里篇幅受限就不具体展开了。

自动宏变量 SYSINFO

SAS 提供了一个名为 SYSINFO 的自动宏变量,每次使用 PROC COMPARE 进行数据集比较之后,都会在这个宏变量中存储一个返回码,该返回码包含了具体的比较结果。

SYSINFO 的具体数值和对应的比较结果信息如下表所示:

比特位 返回码 二进制 描述
1 1 0000 0000 0000 0001 数据集标签不一致
2 2 0000 0000 0000 0010 数据集类型不一致
3 4 0000 0000 0000 0100 变量具有不同的输入格式
4 8 0000 0000 0000 1000 变量具有不同的输出格式
5 16 0000 0000 0001 0000 变量具有不同的长度
6 32 0000 0000 0010 0000 变量具有不同的标签
7 64 0000 0000 0100 0000 base 数据集具有 compare 数据集中不存在的观测
8 128 0000 0000 1000 0000 compare 数据集具有 base 数据集中不存在的观测
9 256 00000 0001 0000 0000 base 数据集具有 compare 数据集中不存在的 by 组
10 512 00000 0010 0000 0000 compare 数据集具有 base 数据集中不存在的 by 组
11 1024 0000 0100 0000 0000 base 数据集具有 compare 数据集中不存在的变量
12 2048 0000 1000 0000 0000 compare 数据集具有 base 数据集中不存在的变量
13 4096 0001 0000 0000 0000 具有不等值
14 8192 0010 0000 0000 0000 具有不同的变量类型
15 16384 0100 0000 0000 0000 by 组的变量不匹配
16 32768 1000 0000 0000 0000 致命错误:未进行比较

如果两个数据集只存在上述表格中的一处不同,则宏变量 SYSINFO 的值就是对应的返回码本身;如果两个数据集存在上述表格中的至少两处不同,则 SYSINFO 的值等于所有涉及到的返回码的总和。

细心的你可能会发现,这里的返回码并不是连续的整数,而是 2 的幂。这样的设计其实是有意为之,观察这些返回码的二进制形式,可以发现它们都只有一个比特位上是 1,并且这个 1 所处的位置与其他返回码都错开了,这样无论 PROC COMPARE 的比较结果有多少种不同的情况,它们的返回码累加之后的二进制形式都能保留了单个情形的比较结果。

例如:如果两个数据集使用 PROC COMPARE 进行比较后,宏变量 SYSINFO 的值是 48,二进制形式为 0000 0000 0011 0000,从右往左数,第 5、6 比特位是 1,结合上表可以得知,这两个数据集仅存在变量标签和变量长度的不一致,而 48 正好是这两种情形对应返回码 16、32 的总和。

有了以上的铺垫,我们可以编写以下程序来识别宏变量 SYSINFO 包含的数据集比较的具体差异:

/* 先捕获 SYSINFO 的值,否则会被下一个 PROC 或 DATA 步重置 */
%let _sysinfo = &sysinfo;
data _null_;
    if &_sysinfo = '...............1'b then put '数据集标签不一致!';
    if &_sysinfo = '..............1.'b then put '数据集类型不一致!';
    if &_sysinfo = '.............1..'b then put '变量具有不同的输入格式!';
    if &_sysinfo = '............1...'b then put '变量具有不同的输出格式!';
    if &_sysinfo = '...........1....'b then put '变量具有不同的长度';
    if &_sysinfo = '..........1.....'b then put '变量具有不同的标签';
    if &_sysinfo = '.........1......'b then put 'base 数据集具有 compare 数据集中不存在的观测!';
    if &_sysinfo = '........1.......'b then put 'compare 数据集具有 base 数据集中不存在的观测!';
    if &_sysinfo = '.......1........'b then put 'base 数据集具有 compare 数据集中不存在的 by 组!';
    if &_sysinfo = '......1.........'b then put 'compare 数据集具有 base 数据集中不存在的 by 组!';
    if &_sysinfo = '.....1..........'b then put 'base 数据集具有 compare 数据集中不存在的变量!';
    if &_sysinfo = '....1...........'b then put 'compare 数据集具有 base 数据集中不存在的变量!';
    if &_sysinfo = '...1............'b then put '具有不等值!';
    if &_sysinfo = '..1.............'b then put '具有不同的变量类型!';
    if &_sysinfo = '.1..............'b then put 'by 组的变量不匹配!';
    if &_sysinfo = '1...............'b then put '致命错误:未进行比较!';
run;

上述代码中,由于 PROC 和 DATA 步都会重置 SYSINFO 的值,因此需要在使用 DATA 步之前捕获 SYSINFO 的值。

标签:COMPARE,0000,技巧,PROC,compare,sysinfo,put,数据,变量
From: https://www.cnblogs.com/snoopy1866/p/17993992

相关文章

  • C# 守护控制台进程(process)
    C#通过Process和list配合不断检测进程并重启该进程使用语言:C#环境:.netFramework4.6.1(当前使用)(貌似支持所有环境,我就不多说了)usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Linq;usingSystem.Text;usingSystem.Threadi......
  • MySQL导入数据小技巧:在不影响业务的前提下,如何平稳迁移数据?
    MySQL导入数据小技巧:在不影响业务的前提下,如何平稳迁移数据?生产案例:产品经理要求把B库里的表迁移到A库里。问:在不影响业务的前提下,如何平稳迁移数据?答:可以做限速,以每秒1MB的速度导入数据,这样CPU和磁盘IO不受影响。shell>pv-a-q-t-L1mtest1.sql|mysql-S/tmp/mysql.sock-......
  • 生活常识-沟通技巧
    前言全局说明生活常识-沟通技巧内容来源于网络,个体差异,如有不适,请到正规医院就诊一、沟通技巧1.1语言回击2024-01-281.等量代换,以牙还牙;场景:(外卖来电话)A:外卖帮我放楼下就行B:还有闲情逸致点下午茶啊,你工作也太轻松了,反正你有时间,帮我把PPT改良吧。A:反正你有腿,帮我......
  • [职场] 面试技巧
    1.必须要在面试时有良好的形象,不仅仅要把紧自己的嘴巴,还要做到三思而后答。2.在回答问题的过程中必须要注意留足进退的余地,真正的做到随机而应变。3.在回答问题的过程中还要做到稳定自己的情绪,沉着而理智的应对一些突发情况。4.必须要注意不置可否地应答,千万不要回......
  • [office] Excel中2010版使用自定义名称简化计算公式的操作技巧
    假设企业申报工资基数为员工的基本工资,用户可将“基本工资”所在单元格区域命名为“申报工资基数”,今天,小编就教大家在Excel中2010版使用自定义名称简化计算公式的操作技巧。Excel中2010版使用自定义名称简化计算公式的操作步骤选择“定义名称”选项,在“员工基本信......
  • 应对图片丢失(Excel技巧集团)
    问题:在M365Excel工作表的单元格里插入图片,将其以单元格对象放置在单元格中,一旦双击该单元格或单击编辑栏,图片就会丢失,如何保证图片不丢失?解决:建一个工作表,在其中以单元格对对象的姿势放置需要使用到的图片,并保护该工作表,数据表中需要用到该图片时直接引用。......
  • 中考英语连词成句解题技巧讲解
    一、命题趋势连词成句是中考英语试题中新设的考查项目。这样,写作实际上分成了三个层次:1)词语的运用。是在命题人规定好的框架内,根据特定的语境,依据基本的规则完成单句。这如同体育竞技中的完成规定动作;2)连词成句。这个环节属于半开放式的表达形式。词汇范围有限定,但组合形式不......
  • [office] 财务人必会的3个排名小技巧!
    1、多区域同时排名如下图,对两个区域的数据,同时进行排名。 在E2中输入公式如下,之后向下填充至E16单元格。=RANK(D2,($D$2:$D$16,$J$2:$J$16),0)在K2中输入公式如下,之后向下填充至K13单元格。=RANK(J2,($D$2:$D$16,$J$2:$J$16),0)注意:上述公式的($D$2:$D$16,$J$2:$J$16)的区分,必须要......
  • [office] Excel转dbf技巧及其注意事项概述
    1.DBF文件只会保存工作表中命名区域或当前区域中的数据:当以dBASE(DB2、DB3或DB4)格式保存Excel工作表、且该工作表中包含一个名为“Database”的区域时,只有命名区域中的数据会保存到dBASE文件中。如果区域命名之后又添加了新记录,则必须重新定义包括新记录的“Database”区域后,才能......
  • [office] Excel表格中数据比对和查找的技巧是什么
    经常被人问到怎么对两份Excel数据进行比对,提问的往往都很笼统;在工作中,有时候会需要对两份内容相近的数据记录清单进行比对,需求不同。以下是小编为您带来的关于Excel表格中数据比对和查找的技巧,希望对您有所帮助。Excel表格中数据比对和查找的技巧Sheet1中包含了一份数......