为什么SAS公司“不愿意”;“合并”;函数用偏差覆盖观察值?

为什么SAS公司“不愿意”;“合并”;函数用偏差覆盖观察值?,sas,Sas,这是我的密码 libname blood "C:\Users\owner\Desktop\SAS"; data blood.donors1; input id type $ units; cards; 2304 o 16 1129 a 48 1129 a 50 1129 a 57 2486 b 63 ; run; data blood.donors2; input id code units; cards; 6488 65 27 1129 63 32 5438

这是我的密码

libname blood "C:\Users\owner\Desktop\SAS";   
data blood.donors1;
   input id type $ units;
   cards;
2304 o 16
1129 a 48
1129 a 50
1129 a 57
2486 b 63 
;
run;

data blood.donors2;
   input id code units;
   cards;
6488 65 27 
1129 63 32
5438 63 39
2304 61 45
1387 64 67
;
run; 

proc sort data=blood.donors1 out=blood.donors1;
   by id;
run;

proc sort data=blood.donors2 
           out=blood.donors2;
   by id;
run;

data blood.donorsmerge;
   merge blood.donors1 (in = indonors1) blood.donors2;
   by id; 
   if indonors1;
run;

这是结果表
donorsmerge



1129 a 48
1129 63 32
完全覆盖。但行
1129a50
1129a57
被部分覆盖。为什么?我看了文件。在我看来,结果数据集应该包含
32
,正如我在上图中指出的那样

,因为merge的工作方式与它看起来的不完全一样,特别是,它不像SQL join那样工作

在引擎盖下,它的工作原理是,对于每个分组,它读取左侧的第一行;然后它会找到一个与之匹配的行。然后,如果左侧数据集中的“按组”有更多行,它将转到下一行。如果右边有另一行要匹配,它将匹配上面两行;否则,它将一事无成。继续,直到“按”组的最后一行。在写入by组的最后一行之后,但在读取下一个by组的第一行之前,它会清除所有变量

每个
by
组对于
code
似乎具有相同的值,原因是
set
merge
update
语句中的变量会自动保留。也就是说,它们没有被设置为缺失(组之间除外,作为
merge
语句的函数)。因此,所有三行的
code
都设置为63-第一行的设置为63,之后不更改

但是,
单位
出现在两个数据集中。因此,当在左侧引入第二行,而在右侧没有第二行时,它将保留左侧的值

如果要完全覆盖变量,则需要从左侧数据集中删除列。如果要覆盖匹配行的变量,而不覆盖非匹配行的变量,并且存在多对一关系(如此处所述),则需要在一个或另一个数据集中重命名变量,并使用
coalesce
coalescc
函数(或逻辑)适当设置变量