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

Merge 为什么“合并”会自动设置我创建的最新数据集?,merge,sas,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 */ inp

我在使用
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;
提交时,日志显示最新创建的表(表2)以某种方式用于创建merge1。实际上,表2列被添加到了merge1应该是什么

试图理解这一点,我发现如果我去掉
set nobs=n,这种情况就不会发生行

我在互联网上找不到原因,但我发现了一些文档,警告说
merge
可能很棘手(但出于其他原因)

因此,我的问题是:

  • 为什么会发生这种情况以及如何解决?(我需要
    nobs
    在我的计算中)我可以在单独的数据步骤中进行合并和以下处理来避免问题,但我想了解整个事情以及如何正确处理它
  • merge
    是否是仅在数据集的一列中添加值的最佳方法?(此处,表1第X列由表3更新,但Y和Z尚未更新)。(如果回答了第一个问题,此问题将是第二个问题)

    • 语句正在
      表2中从
      &SYSLAST
      隐式读取
      set nobs=n
      语句

      就像做

      data table2 ; /* some stuff */ run ; data want ; set ; /* implicity use &SYSLAST - table2 in this case - as input dataset */ 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 X代表Y代表Z代表 1 1 0 2 6 5 1 2 6 6 5 2 5 2 6 10 1 6 10 2 6 15 1 6
      set nobs=n
      语句正在
      表2中隐式地从
      &SYSLAST
      读取

      就像做

      data table2 ; /* some stuff */ run ; data want ; set ; /* implicity use &SYSLAST - table2 in this case - as input dataset */ 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 X代表Y代表Z代表 1 1 0 2 6 5 1 2 6 6 5 2 5 2 6 10 1 6 10 2 6 15 1 6
      set nobs=n
      语句正在
      表2中隐式地从
      &SYSLAST
      读取

      就像做

      data table2 ; /* some stuff */ run ; data want ; set ; /* implicity use &SYSLAST - table2 in this case - as input dataset */ 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 X代表Y代表Z代表 1 1 0 2 6 5 1 2 6 6 5 2 5 2 6 10 1 6 10 2 6 15 1 6
      set nobs=n
      语句正在
      表2中隐式地从
      &SYSLAST
      读取

      就像做

      data table2 ; /* some stuff */ run ; data want ; set ; /* implicity use &SYSLAST - table2 in this case - as input dataset */ 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 X代表Y代表Z代表 1 1 0 2 6 5 1 2 6 6 5 2 5 2 6 10 1 6 10 2 6 15 1 6
      谢谢你的回答!实际上,我希望n是merge1中的行数。我必须开始一个新的数据步骤才能得到它吗?它太完美了。谢谢!谢谢你的回答!实际上,我希望n是merge1中的行数。我必须开始一个新的数据步骤才能得到它吗?它太完美了。谢谢!谢谢你的回答!实际上,我希望n是merge1中的行数。我必须开始一个新的数据步骤才能得到它吗?它太完美了。谢谢!谢谢你的回答!实际上,我希望n是merge1中的行数。我必须开始一个新的数据步骤才能得到它吗?它太完美了。谢谢!