我在使用merge
时遇到了麻烦,我意识到了原因:除了要合并的表外,SAS似乎会自动添加我创建的最新表。以下代码说明了该问题:
DATA table1; /* to be merged dataset no 1*/
input X rep Y Z;
cards;
1 1 0 2
5 1 2 6
5 2 5 2
;
run;
proc sort; by x rep; run;
data table3; /* to be merged dataset no 2 */
input X;
cards;
1
5
5
10
10
15
;
run;
proc sort; by x; run;
data table3; /* rep stands for 'replicate' and makes sure there is no uniqueness issue */
set table3; by x;
retain rep;
if first.x then rep=0;
rep=rep+1; /*rep+1; */
run;
data table2; /*some other table having nothing to do with the merge*/
input Y W;
cards;
1 0
1 0
2 0
3 0
3 0
8 0
;
run;
data merge1;
merge table3 table1;
by x rep;
set nobs=n;
run;
提交时,日志显示创建的最新表(table2)以某种方式用于创建merge1。实际上,table2列被添加到merge1应该是什么。
试图理解这一点,我发现如果我摆脱merge1定义中的set nobs=n;
行,就不会发生这种情况。
我无法在互联网上找到原因,但我发现有几个文件警告merge
如何变得棘手(但出于其他原因)......
因此,我的问题是:
nobs
)我能够在分离的数据步骤中解决合并和后续处理的问题,但我想了解整个事情以及如何正确处理它。merge
是仅在数据集的一列中添加值的最佳方式吗? (这里,table1列X由table3更新,但Y和Z尚未更新)。 (如果第一个问题得到解答,这个问题将是次要的)答案 0 :(得分:3)
set nobs=n
语句隐含地从table2
读取&SYSLAST
。
就像在做
data table2 ; /* some stuff */ run ; data want ; set ; /* implicity use &SYSLAST - table2 in this case - as input dataset */ run ;
我不确定您打算使用set nobs=n
实现什么目标,但没有set nobs=n
的合并数据操作将根据加入条件返回Y
和Z
个值
编辑:
data merge1; merge table3 table1 end=eof ; by x rep; if eof then call symputx('NOBS',_n_) ; run; data merge1 ; set merge1 ; NOBS = &NOBS ; run ;
merge1
X rep Y Z NOBS 1 1 0 2 6 5 1 2 6 6 5 2 5 2 6 10 1 6 10 2 6 15 1 6