我遇到了一个相当奇怪的情况,我连接了两个数据集并得到了意想不到的结果。这是设置:
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!发生了什么事?
谢谢,
答案 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;