如果在多对多SAS合并中没有匹配,如何将保留值设置为丢失?

时间:2017-04-25 18:11:16

标签: 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
        ;
run;

此处数据集a有四行变量i,而数据集b只有两行。

仅使用变量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和4中的变量fg,值已被保留,因为它们在数据集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;

我的想法是,对于第一行后的每一行,我想将所有变量设置为缺失,这样如果他们没有匹配的行,他们的值将不会被覆盖并且仍然会丢失。这将消除保留值。

第二行应创建PDV并且所有元数据都应该可用于创建这些数组并将它们设置为缺失,但是我收到此错误:

  

警告:定义一个零元素的数组。

有关如何修复此代码或其他代码的建议吗?

1 个答案:

答案 0 :(得分:3)

您可能希望覆盖run语句的默认行为,即某些变量的自动输出和自动调用缺失。

这里你output;强制自动输出(与默认行为相同),然后call missing(of _all_);设置所有变量都丢失(而不是只显示mergeset陈述)。

data c;
    merge a b;
    by i;
    output;
    call missing(of _all_);
run; 

你必须在最后而不是开始时这样做的原因是你还没有在开始时定义任何变量 - 所以_numeric__character_或{{1没有任何东西可以参考。

您可以使用_all_解决此问题,但我发现上述解决方案更为简单。真的要么工作正常,要有相同的速度和好处。

if 0 then set a b;