SAS:数据合并简介
数据合并,即两个或者多个数据集的数据合并到一个数据集中,常见的方式有3种,分别是 one-to-one reading、concatenating 和 Match-merging,其中只有最后一种Match-merging是要求匹配字段是已经排好序的。
在介绍之前,准备两个基础数据,是已经按照ID排好序的
cert.patdat
Obs | ID | Age | Sex | Date |
---|---|---|---|---|
1 | A001 | 21 | M | 08/17/1997 |
2 | A002 | 32 | M | 02/18/1986 |
3 | A003 | 24 | F | 06/07/1994 |
4 | A004 | 28 | M | 01/27/1990 |
5 | A005 | 44 | F | 04/24/1974 |
6 | A007 | 39 | M | 07/10/1979 |
7 | A008 | 30 | F | 09/16/1988 |
cert.visit
Obs | ID | Visit | SysBP | DiasBP | Weight | Date |
---|---|---|---|---|---|---|
1 | A001 | 1 | 140 | 85 | 195 | 11/05/2009 |
2 | A001 | 2 | 138 | 90 | 198 | 10/13/2009 |
3 | A001 | 3 | 145 | 95 | 200 | 07/04/2009 |
4 | A002 | 1 | 121 | 75 | 168 | 04/14/2009 |
5 | A003 | 1 | 118 | 68 | 125 | 08/12/2009 |
6 | A003 | 2 | 112 | 65 | 123 | 08/21/2009 |
7 | A004 | 1 | 143 | 86 | 204 | 03/30/2009 |
8 | A005 | 1 | 132 | 76 | 174 | 02/27/2009 |
9 | A005 | 2 | 132 | 78 | 175 | 07/11/2009 |
10 | A005 | 3 | 134 | 78 | 176 | 04/16/2009 |
11 | A008 | 1 | 126 | 80 | 182 | 05/22/2009 |
下面分别看一下三种方式
one-to-one reading
工作原理
创建一个新的数据集,新的数据集包含所有的变量。
根据每个观测在数据集中的位置去匹配,第2个数据集中变量的值会覆盖第1个数据集中变量的值。
结果集中观测的数量和数据量较少的那个数据集一样。
说简单一点,就是先从第1个数据集拿一行,然后再从第2个数据集拿一行去覆盖第1个数据集中数据。以次类推,直到有一个数据集结束。
语法
DATA output-SAS-data-set;
SET SAS-data-set-1;
SET SAS-data-set-2;
RUN;
示例
libname cert 'J:\sas_guide_data\base-guide-practice-data\cert';data tmp1;set cert.patdat;set cert.visit;
run;proc print data=tmp1;
run;
输出:
Obs | ID | Age | Sex | Date | Visit | SysBP | DiasBP | Weight |
---|---|---|---|---|---|---|---|---|
1 | A001 | 21 | M | 11/05/2009 | 1 | 140 | 85 | 195 |
2 | A001 | 32 | M | 10/13/2009 | 2 | 138 | 90 | 198 |
3 | A001 | 24 | F | 07/04/2009 | 3 | 145 | 95 | 200 |
4 | A002 | 28 | M | 04/14/2009 | 1 | 121 | 75 | 168 |
5 | A003 | 44 | F | 08/12/2009 | 1 | 118 | 68 | 125 |
6 | A003 | 39 | M | 08/21/2009 | 2 | 112 | 65 | 123 |
7 | A004 | 30 | F | 03/30/2009 | 1 | 143 | 86 | 204 |
可以看到,两个数据集都有的变量ID和Date,结果集中只出现1次,且被第2个数据集的值覆盖。
当然,上面这个例子没有实际的意义,下图中的例子才有实际的意义:
concatenating
工作原理
即将两个数据集连接起来
语法
DATA output-SAS-data-set;
SET SAS-data-set-1
SAS-data-set-2;
RUN;
示例
data tmp2;set cert.patdatcert.visit;
run;proc print data=tmp2;
run;
输出:
Obs | ID | Age | Sex | Date | Visit | SysBP | DiasBP | Weight |
---|---|---|---|---|---|---|---|---|
1 | A001 | 21 | M | 08/17/1997 | . | . | . | . |
2 | A002 | 32 | M | 02/18/1986 | . | . | . | . |
3 | A003 | 24 | F | 06/07/1994 | . | . | . | . |
4 | A004 | 28 | M | 01/27/1990 | . | . | . | . |
5 | A005 | 44 | F | 04/24/1974 | . | . | . | . |
6 | A007 | 39 | M | 07/10/1979 | . | . | . | . |
7 | A008 | 30 | F | 09/16/1988 | . | . | . | . |
8 | A001 | . | 11/05/2009 | 1 | 140 | 85 | 195 | |
9 | A001 | . | 10/13/2009 | 2 | 138 | 90 | 198 | |
10 | A001 | . | 07/04/2009 | 3 | 145 | 95 | 200 | |
11 | A002 | . | 04/14/2009 | 1 | 121 | 75 | 168 | |
12 | A003 | . | 08/12/2009 | 1 | 118 | 68 | 125 | |
13 | A003 | . | 08/21/2009 | 2 | 112 | 65 | 123 | |
14 | A004 | . | 03/30/2009 | 1 | 143 | 86 | 204 | |
15 | A005 | . | 02/27/2009 | 1 | 132 | 76 | 174 | |
16 | A005 | . | 07/11/2009 | 2 | 132 | 78 | 175 | |
17 | A005 | . | 04/16/2009 | 3 | 134 | 78 | 176 | |
18 | A008 | . | 05/22/2009 | 1 | 126 | 80 | 182 |
同样的,两个数据集都有的变量ID和Date,只出现一次, 但因为这个是连接,所以不存在值覆盖问题。
同样的,上面的例子没有实际意义,只是为了展示工作原理,下面的例子才有实际意义:
Match-merging
工作原理
这个就是merge了,按照某个字段的值进行匹配,如果匹配上,就合并到一条记录中。
语法
DATA output-SAS-data-set;
MERGE SAS-data-set-1
SAS-data-set-2;
BY <DESCENDING> variable(s);
RUN;
示例
data tmp2;merge cert.patdatcert.visit;by id;
run;proc print data=tmp2;
run;
输出
Obs | ID | Age | Sex | Date | Visit | SysBP | DiasBP | Weight |
---|---|---|---|---|---|---|---|---|
1 | A001 | 21 | M | 11/05/2009 | 1 | 140 | 85 | 195 |
2 | A001 | 21 | M | 10/13/2009 | 2 | 138 | 90 | 198 |
3 | A001 | 21 | M | 07/04/2009 | 3 | 145 | 95 | 200 |
4 | A002 | 32 | M | 04/14/2009 | 1 | 121 | 75 | 168 |
5 | A003 | 24 | F | 08/12/2009 | 1 | 118 | 68 | 125 |
6 | A003 | 24 | F | 08/21/2009 | 2 | 112 | 65 | 123 |
7 | A004 | 28 | M | 03/30/2009 | 1 | 143 | 86 | 204 |
8 | A005 | 44 | F | 02/27/2009 | 1 | 132 | 76 | 174 |
9 | A005 | 44 | F | 07/11/2009 | 2 | 132 | 78 | 175 |
10 | A005 | 44 | F | 04/16/2009 | 3 | 134 | 78 | 176 |
11 | A007 | 39 | M | 07/10/1979 | . | . | . | . |
12 | A008 | 30 | F | 05/22/2009 | 1 | 126 | 80 | 182 |
可以看到,两个数据集都有的变量Date,输出中只出现一次, 且被第2个数据集的值覆盖(ID是匹配字段,所以谈不上覆盖),这是第一个问题。
另外一个问题是,结果集中的ID是包含了两个数据集中所有的值,无论是否能匹配上,比如A007只在数据集中patdat中出现过,如果想要结果集中只出现匹配的项怎么办?
针对这两个问题,都是有解决方案的。
问题1:patdat和visit中都有Date变量,但两者的含义并不相同,前者是出生日期,后者是指访问日期,如何避免被覆盖?答案是可以使用rename选项,选项语法为(RENAME=(old-variable-name=new-variable-name))
示例:
data tmp2;merge cert.patdat(RENAME=(Date=BirthDate))cert.visit(RENAME=(Date=VisitDate));by id;
run;proc print data=tmp2;
run;
输出:
Obs | ID | Age | Sex | BirthDate | Visit | SysBP | DiasBP | Weight | VisitDate |
---|---|---|---|---|---|---|---|---|---|
1 | A001 | 21 | M | 08/17/1997 | 1 | 140 | 85 | 195 | 11/05/2009 |
2 | A001 | 21 | M | 08/17/1997 | 2 | 138 | 90 | 198 | 10/13/2009 |
3 | A001 | 21 | M | 08/17/1997 | 3 | 145 | 95 | 200 | 07/04/2009 |
4 | A002 | 32 | M | 02/18/1986 | 1 | 121 | 75 | 168 | 04/14/2009 |
5 | A003 | 24 | F | 06/07/1994 | 1 | 118 | 68 | 125 | 08/12/2009 |
6 | A003 | 24 | F | 06/07/1994 | 2 | 112 | 65 | 123 | 08/21/2009 |
7 | A004 | 28 | M | 01/27/1990 | 1 | 143 | 86 | 204 | 03/30/2009 |
8 | A005 | 44 | F | 04/24/1974 | 1 | 132 | 76 | 174 | 02/27/2009 |
9 | A005 | 44 | F | 04/24/1974 | 2 | 132 | 78 | 175 | 07/11/2009 |
10 | A005 | 44 | F | 04/24/1974 | 3 | 134 | 78 | 176 | 04/16/2009 |
11 | A007 | 39 | M | 07/10/1979 | . | . | . | . | . |
12 | A008 | 30 | F | 09/16/1988 | 1 | 126 | 80 | 182 | 05/22/2009 |
可以看到输出中的BirthDate和VisitDate各占了一个变量
问题2:merge的时候如何只显示真正匹配上的行?
答案是可以使用IN选项,选项语法为IN=variable,它创建一个临时变量,如果当前观测对结果集有用,那么该变量值会被设置为1,否则设置为0,在匹配的时候加上IF关健字判断即可。注:这个变量并不会出现在结果集中。
示例:
data tmp2;merge cert.patdat(IN=tmpvar1 RENAME=(Date=BirthDate))cert.visit(IN=tmpvar2 RENAME=(Date=VisitDate));by id;if tmpvar1 eq 1 AND tmpvar2 eq 1;
run;proc print data=tmp2;
run;
输出:
Obs | ID | Age | Sex | BirthDate | Visit | SysBP | DiasBP | Weight | VisitDate |
---|---|---|---|---|---|---|---|---|---|
1 | A001 | 21 | M | 08/17/1997 | 1 | 140 | 85 | 195 | 11/05/2009 |
2 | A001 | 21 | M | 08/17/1997 | 2 | 138 | 90 | 198 | 10/13/2009 |
3 | A001 | 21 | M | 08/17/1997 | 3 | 145 | 95 | 200 | 07/04/2009 |
4 | A002 | 32 | M | 02/18/1986 | 1 | 121 | 75 | 168 | 04/14/2009 |
5 | A003 | 24 | F | 06/07/1994 | 1 | 118 | 68 | 125 | 08/12/2009 |
6 | A003 | 24 | F | 06/07/1994 | 2 | 112 | 65 | 123 | 08/21/2009 |
7 | A004 | 28 | M | 01/27/1990 | 1 | 143 | 86 | 204 | 03/30/2009 |
8 | A005 | 44 | F | 04/24/1974 | 1 | 132 | 76 | 174 | 02/27/2009 |
9 | A005 | 44 | F | 04/24/1974 | 2 | 132 | 78 | 175 | 07/11/2009 |
10 | A005 | 44 | F | 04/24/1974 | 3 | 134 | 78 | 176 | 04/16/2009 |
11 | A008 | 30 | F | 09/16/1988 | 1 | 126 | 80 | 182 | 05/22/2009 |
可以看到,结果集只有11个了。A007没有匹配上
参考资料:
SAS Certified Specialist Prep Guide
SAS:数据合并简介相关推荐
- 三代测序原理与数据文件简介(SMRT+Nanopore)
三代测序原理与数据文件简介(SMRT+Nanopore) 一生雾梦 2019-12-03 20:48:42 1578 收藏 2 分类专栏: 前沿文献分析 文章标签: 三代测序(SMS) SMRT ...
- 转: MySql数据引擎简介与选择方法
作者:junsan. 网址:http://www.javastar.org:http://www.inspiresky.com.QQ:66883074. 注意:本文以MySQL5.1系列版本为准,其他 ...
- R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...
- SAS︱数据索引、数据集常用操作(set、where、merge、append)
代码部分大多来源于姚志勇老师的<SAS编程与数据挖掘商业案例>. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ ------------ ...
- oracle数据库数据合并,Oracle合并数据
本篇文章帮大家学习Oracle合并数据,包含了Oracle合并数据使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 在本教程中将学习如何使用Oracle MERGE语句来执 ...
- matlab函数merge_MATLAB数据合并方法
在数据处理当中,我们经常碰到数据集合并的需要.在一些语言如SAS,SQL中,数据集合并是一个非常简单的问题,但是在Matlab中,数据集合并则显得稍微复杂了一点. 在Matlab中,要想合并数据,有两 ...
- python用merge匹配和左连接_左手用R右手Python系列——数据合并与追加
感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定! 本文作者:天善智能社区专家杜雨 今天这篇跟大家介绍R语言 ...
- bind merge r 和join_R语言中的数据合并函数(merge,cbind和rbind)的使用
R语言中的数据合并函数(merge,cbind和rbind)的使用-R语言中用cbind() 和rbind() 构建分块矩阵 1.merge函数 两个数据框拥有相同的时间或观测值,但这些列却不尽相同. ...
- mongodb数据合并设计_MongoDB:如何将来自多个集合的数据合并成一个.?
虽然不能实时执行此操作,但可以使用MongoDB1.8+map/Reduce中的"Reduction"Out选项多次运行map-Reduce将数据合并到一起(请参见http:/ww ...
最新文章
- Spring Boot 以 jar 包方式运行在后台
- a=(1,)b=(1),c=(“1”) 分别是什么类型的数据
- Access denied for user 'root'@'localhost' (using password:YES) 解决方案
- 笔记 - Ali Cloud OSS 简介 三种常见数据存储类型
- [转] Oracle中Blob转Clob
- php变量与数组相互转换的方法(extract与compact
- linux网络编程之用select函数实现io复用(基于TCP)引发的思考
- linux u盘加载阵列卡驱动步骤,Linux U盘加载阵列卡驱动步骤
- 训练及优化神经网络基本流程之第0到6步
- 解决WordPress设置错误的url网站不能访问的问题
- 关于linux下的共享库(动态库)和静态库
- python中arcsec_python – 更好的方法来计算Skyfield中两个物体的明显角度分离?
- cad审图软件lisp_cad审图什么软件好 创基出图助手教程(附下载)
- 按键精灵找文字的基础代码模板
- [20130827]A Short History of Nearly Everything[serial]
- tushare接口get_realtime_quotes报错:AssertionError: 33 columns passed, passed data had 34 columns
- C#程序设计之windows应用程序设计基础
- 张俊林:ChatGPT 会成为下一代搜索引擎吗
- 2022-05-19 列式数据库-Clickhouse
- java-net-php-python-jspm购物商城网站演示录像2019计算机毕业设计程序