合并两个具有相同列名的数据集

时间:2019-08-08 04:06:53

标签: merge sas

我有以下数据集AB,它们共享相同的变量(列)ID

enter image description here

如果我像下面那样执行merge

data C ;
 merge A B ;
 by ID ;
run ;
如果两个名称相同(<{1}}列除外,

SAS将获得数据集B的列的值。

enter image description here

是否有任何文档解释这种行为(例如SAS如何决定从哪个数据集中获取值,因为它们都存在于2个数据集中)?我尝试阅读SAS's documentation,但没有发现任何能解释这一点的内容。

1 个答案:

答案 0 :(得分:2)

SAS语言参考的第4章在"DATA Step Processing during Match-Merging"部分中说明了该过程。 我的粗体

  

一对一阅读期间的数据步骤处理

     
      
  • 编译阶段

         
        
    • SAS读取SET语句中命名的每个数据集的描述符信息,然后创建一个程序数据向量,其中包含所有数据集中的所有变量以及DATA步骤创建的变量。
    •   
  •   
  • 执行-步骤1

         
        
    • 当SAS执行第一个SET语句时,SAS将第一个观测值从第一个数据集中读取到程序数据向量中。第二个SET语句将第二个数据集中的第一个观测值读取到程序数据向量中。 如果两个数据集包含相同的变量,则即使缺少该值,第二个数据集中的值也会替换第一个数据集中的值。从最后一个数据集中读取第一个观测值并在执行DATA步骤中的任何其他语句后,SAS会将​​程序数据向量的内容写入新数据集。 SET语句不会将程序数据向量中的值重置为丢失,除了那些在DATA步骤中创建或分配了值的变量之外。
    •   
  •   
  • 执行-步骤2

         
        
    • SAS继续从一个数据集中读取,然后再从另一个数据集中读取,直到它在其中一个数据集中检测到文件结束指示符为止。 SAS停止处理最短数据集的最后观察结果,并且不从较长数据集中读取其余观察结果。
    •   
  •   

MERGEUPDATE语句之间的一个重要区别是,在UPDATE中,第二个数据集中的值替换了第一个数据集中的值,仅当该值不丢失。

当列出两个以上的数据集时,将扩展该概念:

  • 对于MERGE语句,结果是将变量的最右边或最后读取的值放在PDV中
  • 对于UPDATE语句,结果是将变量的最右边或最后读取的NON-MISSING值放在PDV中

注意:MODIFY语句替换主数据集中的值,并且不会像MERGEUPDATE一样重新写入输出数据集。