数据合并,即两个或者多个数据集的数据合并到一个数据集中,常见的方式有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

工作原理

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

工作原理

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

工作原理

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:数据合并简介相关推荐

  1. 三代测序原理与数据文件简介(SMRT+Nanopore)

    三代测序原理与数据文件简介(SMRT+Nanopore) 一生雾梦 2019-12-03 20:48:42  1578  收藏 2 分类专栏: 前沿文献分析 文章标签: 三代测序(SMS) SMRT  ...

  2. 转: MySql数据引擎简介与选择方法

    作者:junsan. 网址:http://www.javastar.org:http://www.inspiresky.com.QQ:66883074. 注意:本文以MySQL5.1系列版本为准,其他 ...

  3. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...

  4. SAS︱数据索引、数据集常用操作(set、where、merge、append)

    代码部分大多来源于姚志勇老师的<SAS编程与数据挖掘商业案例>. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ ------------ ...

  5. oracle数据库数据合并,Oracle合并数据

    本篇文章帮大家学习Oracle合并数据,包含了Oracle合并数据使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 在本教程中将学习如何使用Oracle MERGE语句来执 ...

  6. matlab函数merge_MATLAB数据合并方法

    在数据处理当中,我们经常碰到数据集合并的需要.在一些语言如SAS,SQL中,数据集合并是一个非常简单的问题,但是在Matlab中,数据集合并则显得稍微复杂了一点. 在Matlab中,要想合并数据,有两 ...

  7. python用merge匹配和左连接_左手用R右手Python系列——数据合并与追加

    感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定! 本文作者:天善智能社区专家杜雨 今天这篇跟大家介绍R语言 ...

  8. bind merge r 和join_R语言中的数据合并函数(merge,cbind和rbind)的使用

    R语言中的数据合并函数(merge,cbind和rbind)的使用-R语言中用cbind() 和rbind() 构建分块矩阵 1.merge函数 两个数据框拥有相同的时间或观测值,但这些列却不尽相同. ...

  9. mongodb数据合并设计_MongoDB:如何将来自多个集合的数据合并成一个.?

    虽然不能实时执行此操作,但可以使用MongoDB1.8+map/Reduce中的"Reduction"Out选项多次运行map-Reduce将数据合并到一起(请参见http:/ww ...

最新文章

  1. Spring Boot 以 jar 包方式运行在后台
  2. a=(1,)b=(1),c=(“1”) 分别是什么类型的数据
  3. Access denied for user 'root'@'localhost' (using password:YES) 解决方案
  4. 笔记 - Ali Cloud OSS 简介 三种常见数据存储类型
  5. [转] Oracle中Blob转Clob
  6. php变量与数组相互转换的方法(extract与compact
  7. linux网络编程之用select函数实现io复用(基于TCP)引发的思考
  8. linux u盘加载阵列卡驱动步骤,Linux U盘加载阵列卡驱动步骤
  9. 训练及优化神经网络基本流程之第0到6步
  10. 解决WordPress设置错误的url网站不能访问的问题
  11. 关于linux下的共享库(动态库)和静态库
  12. python中arcsec_python – 更好的方法来计算Skyfield中两个物体的明显角度分离?
  13. cad审图软件lisp_cad审图什么软件好 创基出图助手教程(附下载)
  14. 按键精灵找文字的基础代码模板
  15. [20130827]A Short History of Nearly Everything[serial]
  16. tushare接口get_realtime_quotes报错:AssertionError: 33 columns passed, passed data had 34 columns
  17. C#程序设计之windows应用程序设计基础
  18. 张俊林:ChatGPT 会成为下一代搜索引擎吗
  19. 2022-05-19 列式数据库-Clickhouse
  20. java-net-php-python-jspm购物商城网站演示录像2019计算机毕业设计程序

热门文章

  1. 【欣赏】logo设计原则 + 一组设计独特的logo欣赏
  2. 实战案例 | Scrapy 集成Selenium爬取智联招聘数据
  3. echarts3.7.1 用例体验地图
  4. 谷粒学院笔记-第二天-数据库设计
  5. 2017年四月份小结和五月份计划
  6. iOS开发笔记之二十四——Xcode下类中供外部调用的方法添加注释说明技巧
  7. LightGBM详细
  8. 电脑Win10 企业版如何激活
  9. 下载安卓手机app内不允许下载的视频
  10. outlook没有显示已连接到服务器上,Outlook无法连接到服务器怎么办?