我在SAS中有一个问题。您通常如何确定两个数据集之间的差异?下面是我使用的代码。这就是我用来确定记录是否在一个数据集中而不在另一个数据集中的方法。例如,如果有人在运行代码,则记录计数更高或更低。我正在寻找其他选择。谢谢。
PROC SORT DATA=IVT.REQ_1_3_17 OUT=lob.REQ_1_3_17i;
BY ACCT_NB DAY_TIME_DIM_NB TXN_AM TXN_POSTING_SEQ CS_TXN_CD REQ_1_3_EXCL;
RUN;
PROC SORT DATA=lob.REQ_1_3_17 OUT=lob.REQ_1_3_17l;
BY ACCT_NB DAY_TIME_DIM_NB TXN_AM TXN_POSTING_SEQ CS_TXN_CD REQ_1_3_EXCL;
RUN;
DATA lob.MISMATCHES_1;
MERGE lob.REQ_1_3_17i(IN =A) lob.REQ_1_3_17l(IN=B);
BY ACCT_NB DAY_TIME_DIM_NB TXN_AM TXN_POSTING_SEQ CS_TXN_CD REQ_1_3_EXCL;
IF A AND NOT B;
RUN;
答案 0 :(得分:1)
有很多方法可以找到两个数据集中的差异。标准的是PROC COMPARE,它具有OUT选项,可将所有差异保存在数据集中。您可以使用特殊选项来仅输出不同的值:
proc compare
base=lob.REQ_1_3_17i
comp=lob.REQ_1_3_17l
out=differences
outDif outBase outComp outNoEqual
;
run;
该过程生成了一个自动宏变量,称为SYSINFO。有了它,您无需了解OUT数据集即可了解一般的差异类型。有关更多详细信息,请参见SAS help。
在 差异 数据集中,您可以找到有关比较的详细信息。 “ _TYPE _ ”变量显示差异类型。当其值为DIF时,值会有差异。如果数字变量不同,它将仅包含两个值之间的差。如果字符变量与众不同,您将得到类似“ .X..X ...”的信息,这意味着第二个和第五个字符中的两个值有所不同。
听起来不错,直到您的数据具有不同数量的记录或不同的ID变量。为此,您应该使用ID语句,以便在比较之前对值进行分组。
proc compare
.....;
id acct_nb;
run;
在现实生活中,除非最终比较,否则我不会经常使用proc比较。我通常不需要知道详细程度,只需要选择一些具有不同值的ID变量即可。合并语句是解决它的一种方法,但是我更喜欢使用SQL。想法是合并两个数据集,然后使用catx为每个记录创建一个唯一的“ ID”变量,然后在每个数据集中搜索它。
proc SQL;
create table differences as
select distinct idVar1, idVar2, idVar3
from data1 natural full join data2
where
catx('@',idVar1, idVar2, ...., var1, var2, ...)
not in (select catx('@',idVar1, idVar2, ...., var1, var2, ...) from data1)
or
catx('@',idVar1, idVar2, ...., var1, var2, ...)
not in (select catx('@',idVar1, idVar2, ...., var1, var2, ...) from data2)
;
quit;
注意 :此方法无法捕获完整的重复项,因此,如果您的数据可以包含重复项,并且一定要知道这一点,请使用其他方法。您还需要记住,最大字符串值为32767,如果变量之一只能包含该字符,则用其他内容(例如“ $ @`”)替换“ @”。