为什么多对多合并不做笛卡尔积

时间:2014-07-15 14:17:13

标签: sas

data jul11.merge11;
input month sales ;
datalines ;
1 3123
1 1234
2 7482
2 8912
3 1284

;
run;


data jul11.merge22;
input month goal ;
datalines;
1 4444
1 5555
1 8989
2 9099
2 8888
3 8989
;
run;

data jul11.merge1;
merge jul11.merge11  jul11.merge22 ;
by month;
difference =goal - sales ;

run;

proc print data=jul11.merge1 noobs;
run;

输出:

月销售目标差异

1   3123    4444    1321

1   1234    5555    4321

1   1234    8989    7755

2   7482    9099    1617

2   8912    8888    -24

3   1284    8989    7705

为什么它与表1中的所有观察结果不符合表2中的常见月份?

pdv保留观察数据,以便在重新初始化之前寻找是否有任何更多的观察结果留给该组,在这种情况下,它应该已经完成​​笛卡尔积。

为一对多合并提供完美的笛卡尔积,但不是为了多对多。

2 个答案:

答案 0 :(得分:3)

这是因为SAS处理数据步骤的方式。合并永远不是真正的笛卡尔积(即,所有记录都会被搜索并与所有其他记录匹配,就像SQL逗号连接一样); SAS做了什么(在两个数据集的情况下)是跟随一个数据集(左边的那个)并前进到下一个特定的按组值;然后它会查看正确的数据集,然后继续前进,直到达到组值。如果中间有其他记录,则单独处理这些记录。如果没有,但有匹配,则匹配这些记录。

然后它在左侧查看该组中是否还有其他内容,如果有,则前进到下一个。它在右侧也是如此。如果只有其中一个匹配,那么它只会带来这些值;因此,如果左边有1个元素,右边有5个元素,它会做1x5或5行。但是,如果左边有2个,右边有3个,则不会做2x3 = 6;它执行1:1,2:2和2:3,因为它按顺序推进了记录指针。

以下示例是查看其工作原理的好方法。如果你真的想要看到它的实际效果,请引入数据步调试器并以交互方式使用它。

data test1;
input x row1;
datalines;
1 1
1 2
1 3
1 4
2 1
2 2
2 3
3 1
;;;;
run;

data test2;
input x row2;
datalines;
1 1
1 2
1 3
2 1
3 1
3 2
3 3
;;;;
run;


data test_merge;
merge test1 test2;
by x;
put x= row1= row2=;
run;

如果您确实想在SAS datastep中进行笛卡尔连接,则必须执行嵌套的SET语句。

data want;
set test1;
do _n_ = 1 to nobs_2;
  set test2 point=_n_ nobs=nobs_2;
  output;
end;
run;

那是真正的笛卡儿,你可以通过群体平等来测试;但那太乱了,真的。您还可以使用哈希表查找,这对BY组更有效。讨论了here

答案 1 :(得分:0)

SAS在datastep中不能很好地处理多对多合并。如果要进行多对多合并,则需要使用PROC SQL。