SAS是否有一种有效的方法来验证您运行的联接是1对1还是1对多联接?我经常使用没有明确唯一标识符的表格,这导致我运行1-many连接,认为它们是1-1,从而弄乱了我的分析。
答案 0 :(得分:1)
您可以使用IN=
标记,但需要清除它们。
让我们制作一些样本数据集。
data one;
do id=1,2,2,3;
output;
end;
run;
data two;
do id=1,1,2,2,3,3;
output;
end;
run;
现在按ID合并它们。在MERGE语句之前清除IN =变量,这样只需一次观察就不会在数据集上继承该标志。
data want ;
call missing(in1,in2);
merge one(in=in1) two (in=in2);
by id;
if not first.id and sum(of in1-in2)> 1 then put 'Multiple Merge: ' (_n_ id in1 in2) (=);
run;
LOG中的结果。
Multiple Merge: _N_=4 id=2 in1=1 in2=1
NOTE: MERGE statement has more than one data set with repeats of BY values.
NOTE: There were 4 observations read from the data set WORK.ONE.
NOTE: There were 6 observations read from the data set WORK.TWO.
NOTE: The data set WORK.WANT has 6 observations and 1 variables.
答案 1 :(得分:1)
在我希望合并的输入数据集由某个键是唯一的简单情况下,我经常会在合并中编写一个简单的断言,如果找到任何重复项就会抛出错误:
示例数据:
data one;
do id=1,2,3;
output;
end;
run;
data two;
do id=1,2,2,3,4,4;
output;
end;
run;
日志:
16 data want;
17 merge one two;
18 by id;
19 if not (first.id and last.id) then put "ERROR: duplicates!" id=;
20 run;
ERROR: duplicates!id=2
ERROR: duplicates!id=2
ERROR: duplicates!id=4
ERROR: duplicates!id=4
NOTE: There were 3 observations read from the data set WORK.ONE.
NOTE: There were 6 observations read from the data set WORK.TWO.
NOTE: The data set WORK.WANT has 6 observations and 1 variables
这并没有告诉你哪个数据集有重复(因为你需要在=汤姆的答案中使用=变量),但它是一个简单的安全网来捕捉重复。
您也可以在合并后检查输出数据集是否有重复项,例如
data _null_;
set want (keep=id);
by id;
if not (first.id and last.id) then put "ERROR: Duplicate ! " id=;
run;
重复是危险的。
答案 2 :(得分:1)
在合并之前检查是一个更好的主意......以下是两种不错的简单方法。 (假设我们有一个名为one
的数据集,其列id
将用于合并。)
PROC FREQ
proc freq data = one noprint;
table id /out = freqs_id_one(where=(count>1));
run;
nodupkey
...重定向不同数据集中的重复ID:
proc sort data=one nodupkey out=one_nodupids dupout=one_dupids;
by id;
run;
如果你发现太晚了,你没有检查欺骗(doh!),你可以用PROC FREQ
(与上面相同的代码)或{{1}获得id的频率} query:
PROC SQL