Merge 如果存在';在多对多SAS合并中没有匹配项?
我有两个我想合并在一起的数据集,它们按变量重复,但行数不相等。在SAS中,默认行为是为所有不匹配的行保留值 例如:Merge 如果存在';在多对多SAS合并中没有匹配项?,merge,sas,many-to-many,retain,Merge,Sas,Many To Many,Retain,我有两个我想合并在一起的数据集,它们按变量重复,但行数不相等。在SAS中,默认行为是为所有不匹配的行保留值 例如: data a; input i x y; datalines; 1 1 5 1 2 6 1 3 7 1 4 8 ; run; data b; input i f g $; datalines; 1 9 aa 1 8 bb
data a;
input i x y;
datalines;
1 1 5
1 2 6
1 3 7
1 4 8
;
run;
data b;
input i f g $;
datalines;
1 9 aa
1 8 bb
;
run;
这里数据集a
有四行by变量i
,而数据集b
只有两行
单独与by变量i
合并会产生以下结果:
data c;
merge a b;
by i;
run;
Obs i x y f g
1 1 1 5 9 aa
2 1 2 6 8 bb
3 1 3 7 8 bb
4 1 4 8 8 bb
您可以看到,对于obs 3和obs 4中的变量f
和g
,这些值已被保留,因为它们在数据集a
中没有匹配项
我试图产生的是以下输出:
Obs i x y f g
1 1 1 5 9 aa
2 1 2 6 8 bb
3 1 3 7 .
4 1 4 8 .
我正在使用SAS 9.4,这就是我所尝试的:
data c;
if _n_>1 then do;
array num{*} _numeric_;
array char{*} _character_;
call missing(of num{*});
call missing(of char{*});
end;
merge a b;
by i;
run;
我的想法是,对于第一行之后的每一行,我希望将所有变量都设置为missing,这样,如果它们没有匹配的行,它们的值就不会被覆盖,并且仍然会丢失。这将消除保留值
到第二行时,应创建PDV,所有元数据应可用于创建这些数组,并将其设置为“缺少”,但我遇到以下错误:
警告:定义具有零元素的数组
有没有关于如何修复此代码或其他代码的建议 您可能希望覆盖
run
语句的默认行为,即某些变量的自动输出和自动调用丢失
在这里你可以输出
强制自动输出(与默认行为相同),然后调用missing(of u all_41;
将所有变量设置为缺失(而不是只有那些未出现在merge
或set
语句中的变量)
您必须在末尾而不是开始时执行此操作的原因是,您还没有在开始时定义任何变量-因此\u numeric\u
、\u character\u
或\u all\u
没有任何可参考的内容
您可以使用来修复此问题,如果为0,则设置为b代码>,但我发现上面的解决方案更简单一些。实际上,两者都可以很好地工作,并且具有相同的速度和效益
data c;
if 0 then set a b; *defines all of the variables, but `if 0` means it will not pull any data;
call missing(of _all_); *sets everything missing;
merge a b;
by i;
run;
data c;
if 0 then set a b; *defines all of the variables, but `if 0` means it will not pull any data;
call missing(of _all_); *sets everything missing;
merge a b;
by i;
run;