连接两个数据集并在SAS中获得意外结果

时间:2017-12-01 03:46:20

标签: io sas set concatenation

我遇到了一个相当奇怪的情况,我连接了两个数据集并得到了意想不到的结果。这是设置:

data a;
    do i=1 to 100;
        output;
    end;
run;


data b;
    do j=5 to 79;
        output;
    end;
run;

data c;
    set a b;
    if j=. then j=i;
run;

有人可以向我解释为什么j在前100次观察中取值为“1”吗?它看起来像j被保留,但即使更奇怪,如果我将条件更改为:

data c;
    set a b;
    if i=. then i=j;
run;

然后一个“保留”声明“意味着在第100次观察之后,你应该看到100保留下来,但事实并非如此!它是5!发生了什么事?

谢谢,

1 个答案:

答案 0 :(得分:3)

来自输入数据集的所有变量都是“保留”的。您通常不会注意到它,因为SET语句执行时会覆盖这些值。在您的示例数据集中,B对前几个观察值没有贡献,因此在您开始从数据集{{1}开始读取之前,您在数据步骤的第一次迭代中放入变量J的值不会被覆盖}}

另一个问题是,当您从阅读数据集B转换到阅读日期集A时,将清除源自B的变量。

在您的数据步骤中添加一些PUT语句,以便您可以观察正在发生的事情,从而使其更加清晰。

A

结果

data both;
  put / 'TOP   :' (_n_ i j) (=);
  set a(obs=3) b(obs=3) ;
  put 'MIDDLE:' (_n_ i j) (=);
  if missing(j) then j=i ;
  put 'BOTTOM:' (_n_ i j) (=);
run;