问题
要对SAS中的最后一次观察进行操作,可以设置结束标志,例如
data myResult;
merge myInput1 (in=in1) myInput2 (in=in2) end=last;
by myKey;
** Do some stuff **;
if last then ** Do special stuff **;
run;
但是,当我的一个输入到达终点时,我该如何反应呢?myInput1 (in=in1 end=end1)
不工作。
上下文
我想比较两个大型数据集的内容,从而将观测值限制在999。如果myInput1
在中间包含一些额外的观察结果,我的程序会报告这一点,但也会报告myInput2
中被myInput1
中的obs=999
子句排除的一些行。我实际上想写:
data diff_&memName.;
format problem $20.;
merge myInput1(in=in1 end=end1 obs=999)
myInput2(in=in2 end=end2 obs=999)
by moederartikelnr;
select;
when (end1 or end2) delete;
when (not inFrom) problem = "only in 1_PROD";
when (not inTo) problem = "only in 2_DVLP";
when (not first.moederartikelnr or not last.moederartikelnr)
problem = 'duplicate key';
otherwise delete;
end;
run;
如果你能用另一种方式帮助我,也请这样做。
考虑到您的上下文,我认为在1000次迭代后停止DATA步骤可能更容易。在每次迭代中,从数据集或两者中读取一条记录。因此,在999次迭代之后,将读取999条记录(不一定同时读取999条)。使用此方法,您不需要OBS=选项,因此这将避免错误的误匹配。类似于:
data diff_&memName.;
if _n_=1000 then stop; *stop on 1000th iteration;
format problem $20.;
merge myInput1(in=in1)
myInput2(in=in2)
;
by moederartikelnr;
select;
when (not in1) problem = "only in myinput2";
when (not in2) problem = "only in myinput1";
when (not first.moederartikelnr or not last.moederartikelnr)
problem = 'duplicate key';
otherwise delete;
end;
run;