为什么合并会自动设置我创建的最新数据集?

时间:2014-06-10 12:36:51

标签: merge sas

我在使用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应该是什么。a wild table2 appears !

试图理解这一点,我发现如果我摆脱merge1定义中的set nobs=n;行,就不会发生这种情况。

我无法在互联网上找到原因,但我发现有几个文件警告merge如何变得棘手(但出于其他原因)......

因此,我的问题是:

  • 为什么会发生这种情况以及如何解决? (我在计算中需要nobs)我能够在分离的数据步骤中解决合并和后续处理的问题,但我想了解整个事情以及如何正确处理它。
  • merge是仅在数据集的一列中添加值的最佳方式吗? (这里,table1列X由table3更新,但Y和Z尚未更新)。 (如果第一个问题得到解答,这个问题将是次要的)

1 个答案:

答案 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的合并数据操作将根据加入条件返回YZ个值

编辑:

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