1.一对一合并
基本格式如下:
data output-data-set;
set data-set1;
set data-set2;(data-set1和data-set2可以是相同的数据集,可以添加多个set 语句来实现上述的一对一合并)
run;
输出数据集结果如下:
a.会包含所有输入数据的变量名,如果数据集包含相同的变量名,则最后读入的值会覆盖前面读入的值;
b.新的数据集的观测数是以输入数据集最少观测数为准,数据集合并是以位置为前提,即第一行与第一行合并,因此读入最少数据集的结束读入数据标志就会停止执行DATA步导出数据集。
2.纵向合并
基本格式:
data output-data-set;
set data-set1 data-set2;(可以设置多个数据集)
run;
a.合并的数据集必须为相同的类型,如果不是,则会报错;
b.多个输入数据集有相同变量名的话以第一个数据集长度、标签、format和informat为准;
3.交叉合并
基本格式如下:
data output-data-set;
set data-set1 data-set2;(可以是多个SAS数据集)
by variables;
run;
data-set1和data-set2需要提前按照By 语句的变量名进行升序排序。
在data-set1和data-set2 会按照by语句变量名按顺序读取。
4.横向合并
基本格式如下:
data output-data-set;
merge data-set1 data-set2;
by <descending> variables;(可以按倒序排序后横向合并数据集)
run;
如果使用descending则表示变量名按倒序排列,但只对该descending 后连着的变量有用
5.数据横向合并的逻辑
编译阶段:读入MERGE语句设置的输入数据集的相关信息,以及检查DATA步的程序,为合并后的数据创建PDV(程序向量),为MERGE语句中每个数据集创建记录指针(tracking pointer)
执行阶段:SAS会提前检查是否根据BY语句匹配,如果匹配,会放入对应的PDV里面,如果存在相同的变量名称,则来自于前面数据集变量值会决定该变量的类型、长度等,变量值则来源后面对数据集;如果不匹配,则会按顺序依次放入PDV内。
当所有数据集里面BY 语句中的变量值均发生改变该才会将PDV的值设为缺失,否则会保留上一行的数据值。
如下图所示:
BY语句未在所有的数据集里面发生变化:
BY语句在所有的数据集里面发生变化:
使用IN=variable可以追踪观测的来源,该variable是个临时变量,不在SAS数据集里面存在,取值为0和1,如果输出数据集某行有贡献则取值1,否则为0;
如下所示:
该程序表明在demog和visit两个数据集中共有BY 语句变量值的行数被输出到merged数据集中。
上述IF语句可修改如下:
第2个IF语句判断不为0或不为缺失的值
6.SET 语句还可以和DO 循环一起使用
该程序表示,每次执行DATA步则会首先执行IF语句,从第一行读入到最后一行,因为每次重复读入则只会在PDV中存在最后一行。