Merge 如果存在';在多对多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

我有两个我想合并在一起的数据集,它们按变量重复,但行数不相等。在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
        ;
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;