通过示例学SAS(7)--分割和合并数据集
1.从一个数据集中分拆两个子集
如果output没有指明数据子集的名字,SAS将把结果输出到data所指明的每个数据集中。
2.增加观测值到数据集
设有两个数据集,分别为one和two,其内容分别为
Listing of ONE
Obs ID Name Weight
1 7 Adams 210
2 1 Smith 190
3 2 Schneider 110
4 4 Gregory 90
Listing of TWO
Obs ID Name Weight
1 9 Shea 120
2 3 O'Brien 180
3 5 Bessler 207
每个数据集有相同的变量名,变量的长度也相同。一种合并的形式为
data one_two;
set one two;
run;
得到输出结果为
Listing of one_two
Obs ID Name Weight
1 7 Adams 210
2 1 Smith 190
3 2 Schneider 110
4 4 Gregory 90
5 9 Shea 120
6 3 O'Brien 180
7 5 Bessler 207
数据集two的数据接在one的后面,SAS谓之为串联数据集。如果两个数据集的变量不相同,会发生什么情况呢?假设有第三个数据集,如
Listing of THREE
Obs ID Gender Name
1 10 M Horvath
2 15 F Stevens
3 20 M Brown
数据集Three包含了一个新变量Gender,不存在变量Weight。执行下述代码
data one_three;
set one three;
run;
输出结果如下
Obs ID Name Weight Gender
1 7 Adams 210
2 1 Smith 190
3 2 Schneider 110
4 4 Gregory 90
5 10 Horvath . M
6 15 Stevens . F
7 20 Brown . M
注意,输出数据集的变量的长度将和第一个数据集的变量的长度相同。最好在合并检查字符型变量的长度。最后,如果一个变量在一个数据集为数值型 ,在另一个数据集为字符型,输出结果会报错。
3.合并两个数据集
例如,有一个雇员集(Employee),含有变量雇员ID和雇员名字。另外一个数据集(Hour)有雇员ID,工作类别和工作时间。现在想增加名字到Hour数据集中。
proc sort data=employee;
by ID;
run;
proc sort data=hours;
by ID;
run;
data combine;
merge employee hours;
by ID;
run;
假如想使得合并后的数据集,仅含有Hour中的雇员。怎么办呢?参看下述代码
data new;
merge employee(in=InEmploy)
hours (in=InHours);
by ID;
file print;
put ID= InEmploy= InHours= Name= JobClass= Hours=;
run;
in后面是临时变量名,并不输出到结果中。当数据集中有观测值输出到结果集时,此值设为1,不然设为0.下列代码合并既在employee又在hours中的观测值。
data combine;
merge employee(in=InEmploy)
hours(in=InHours);
by ID;
if InEmploy and InHours;
run;
如果合并的变量名不相同,那就改名好了。
data sesame;
merge bert
ernie(rename=(EmpNo = ID));
by ID;
run;
在前面的讨论中,每一个by variable的值所对应的观测值只有一个,称之为“ 一对一合并”。如果一个by variable所对应的观测值不只一个,称之为“一对多合并”。例如,有下述两个数据集
Listing of Data Set BERT
ID X
123 90
222 95
333 100
Listing of Data Set OSCAR
ID Y
123 200
123 250
222 205
333 317
333 400
333 500
注意到同一个ID号有多条观测值。合并后结果为
Listing of COMBINE
Obs ID X Y
1 123 90 200
2 123 90 250
3 222 95 205
4 333 100 317
5 333 100 400
6 333 100 500
基于ID号的X值被添加到每一条记录中去。如果是“多对多合并”的话,就是一场灾难了。对于每一个by variable的值,两个数据集均有两个以上的观测值。合并后会有什么结果呢?考察以后两个数据集。
Listing of ONE
Obs ID X
1 123 90
2 123 80
3 222 95
4 333 100
5 333 150
6 333 200
Listing of TWO
Obs ID Y
1 123 3
2 123 4
3 123 5
4 222 6
5 333 7
6 333 8
合并后结果如下
Listing of MANY_TO_MANY
Obs ID X Y
1 123 90 3
2 123 80 4
3 123 80 5
4 222 95 6
5 333 100 7
6 333 150 8
7 333 200 8
SAS会以X中的最后一个值(80)来对应Y的剩下的值。看来,多对多的合并会得到这样奇怪的结果。