通过示例学SAS(7)--分割和合并数据集

1.从一个数据集中分拆两个子集

ContractedBlock.gif ExpandedBlockStart.gif Code
1data males females;
2   set learn.survey;
3   if gender = 'F' then output females;
4   else if gender = 'M' then output males;
5run; 

 

如果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的剩下的值。看来,多对多的合并会得到这样奇怪的结果。

转载于:https://www.cnblogs.com/zgw21cn/archive/2008/08/22/1274210.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值