注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

零售创新,创新那些事儿,SPSS,VBA

零售创新

 
 
 

日志

 
 
关于我

新浪微博,零售创新 研究经理,数据分析师 希望和市场研究和零售业的同事共同进步! 本博客发表的都是免费或试用的资料,如果有版权问题请发邮件wangli12a@163.com联系删除。 spss excel vba blog

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

2013-08-30 10:40:05|  分类: SAS学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
通过示例学SAS(7)--分割和合并数据集

原文地址:http://www.cnblogs.com/zgw21cn/archive/2008/08/22/1274210.html

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


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

  评论这张
 
阅读(511)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018