如何检查SAS中的加入是1-1还是1?

时间:2016-05-13 14:52:16

标签: join sas

SAS是否有一种有效的方法来验证您运行的联接是1对1还是1对多联接?我经常使用没有明确唯一标识符的表格,这导致我运行1-many连接,认为它们是1-1,从而弄乱了我的分析。

3 个答案:

答案 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

识别重复的ID
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