SAS篇 | merge应用实例

官方SAS help链接

1.句法规则

MERGE SAS-data-set-1 <(data-set-options)>SAS-data-set-2 <(data-set-options) ><...SAS-data-set-n <(data-set-options)> ><END=variable>;

2.详情

2.1概述

MERGE 语句很灵活,在 SAS 编程中有多种用途。 本节介绍 MERGE 的基本用法。 其他应用包括使用多个 BY 变量、合并两个以上的数据集,以及将一些观察结果与另一个数据集中的所有观察结果合并。

2.2将数据集列表与 MERGE 结合使用

您可以在 MERGE 语句中使用数据集列表。 数据集列表提供了一种快速引用现有数据集组的方法。 这些数据集列表必须是名称前缀列表或编号范围列表。

名称前缀列表是指以指定字符串开头的所有数据集。 例如,合并 SALES1:; 告诉 SAS 合并所有以“SALES1”开头的数据集,例如 SALES1、SALES10、SALES11 和 SALES12。

编号范围列表要求您拥有一系列同名的数据集,但最后一个或多个字符是连续数字。 在编号范围列表中,您可以以任何数字开头并以任何数字结尾。 例如,这些列表引用了相同的数据集:

sales1 sales2 sales3 sales4
sales1-sales4

注意:如果第一个数据集名称的数字后缀包含前导零,则最后一个数据集名称的数字后缀的位数必须大于或等于第一个数据集名称的位数。 否则,会发生错误。 例如,数据集列出 sales001–sales99 和 sales01–sales9 会导致错误。 数据集列表 sales001–sales999 有效。 如果第一个数据集名称的数字后缀不包含前导零,则第一个和最后一个数据集名称的数字后缀中的位数不必相等。 例如,数据集列表 sales1–sales999 是有效的。

使用编号数据集列表时要考虑的其他一些规则如下:
您可以指定范围组。
merge cost1-cost4 cost11-cost14 cost21-cost24;

您可以将编号范围列表与名称前缀列表混合使用。
merge cost1-cost4 cost2: cost33-37;

您可以将单个数据集与数据集列表混合使用。
merge cost1 cost10-cost20 cost30;

数据集列表周围的引号将被忽略。
/* 这两行是一样的 */
merge sales1-sales4;
merge 'sales1'n-'sales4'n;

数据集名称中的空格无效。如果使用引号,则忽略尾随空格。
/* 这些语句中的空格会导致错误 /
merge sales 1-sales 4;
merge 'sales 1'n - 'sales 4'n;
/
此语句中的尾随空格将被忽略 */
merge 'sales1'n - 'sales4'n;

最大数字后缀为 2147483647。
/* 这个后缀会导致错误 */
merge prod2000000000-prod2934850239;

不允许使用物理路径名。
/* 物理路径名会导致错误 */
%let work_path = %sysfunc(pathname(WORK));
merge "&work_path\dept.sas7bdat"-"&work_path\emp.sas7bdat" ;

2.3一对一合并

一对一合并将来自两个或多个 SAS 数据集的观测值组合成新数据集中的单个观测值。要执行一对一合并,请使用不带 BY 语句的 MERGE 语句。 SAS 将 MERGE 语句中命名的所有数据集中的第一个观测值合并到新数据集中的第一个观测值中,将所有数据集中的第二个观测值合并到新数据集中的第二个观测值中,依此类推。在一对一合并中,新数据集中的观察数量等于 MERGE 语句中指定的最大数据集中的观察数量。有关一对一合并的示例,请参见示例 1。有关详细信息,请参阅 SAS 语言参考:概念中的读取、组合和修改 SAS 数据集。

警告

将数据集与一对一合并合并时要小心。一对一合并有时会产生不良结果。在使用此方法之前,在数据集的代表性样本上测试您的程序。

2.4匹配合并

匹配合并根据公共变量的值将来自两个或多个 SAS 数据集的观测值合并为新数据集中的单个观测值。新数据集中的观察数是所有数据集中每个BY组中最大的观察数之和。要执行匹配合并,请在 MERGE 语句之后立即使用 BY 语句。 BY 语句中的变量必须对所有数据集通用。在 DATA 步中,每个 MERGE 语句只能伴随一个 BY 语句。 MERGE 语句中列出的数据集必须按 BY 语句中列出的变量值的顺序排序,或者它们必须具有适当的索引。有关匹配合并的示例,请参见示例 2。有关详细信息,请参阅 SAS 语言参考:概念中的读取、组合和修改 SAS 数据集。

注意:

MERGE 语句不会在多对多匹配合并中生成笛卡尔积。相反,它执行一对一合并,同时在 BY 组中至少有一个数据集中有观测值。当 BY 组中的所有观测值都已从一个数据集中读取,而另一个数据集中还有更多观测值时,SAS 将执行一对多合并,直到读取了所有 BY 组观测值。

3.比较

  • MERGE 结合了来自两个或多个 SAS 数据集的观察结果。 UPDATE 结合了来自两个 SAS 数据集的观察结果。 UPDATE 也会更改或更新主数据集中选定观测值的值。 UPDATE 也可能会添加观察结果。
  • 与 UPDATE 一样,MODIFY 通过更改或更新主数据集中选定观测值的值来组合来自两个 SAS 数据集的观测值。
  • 使用两个或多个 SET 语句读取观察值获得的结果与使用不使用 BY 语句的 MERGE 语句获得的结果相似。但是,对于 SET 语句,如果观察的数量不相等,SAS 会在从所有数据集中读取所有观察之前停止处理。相反,SAS 继续处理在 MERGE 语句中命名的所有数据集中的所有观测值。

4.举例:

/SAS HELP上的官方示例/

/Example 1: One-to-One Merging/

*定义:
一对一合并数据将多个输入数据集中的行合并为新输出数据集中的一行。
行根据它们在输入数据集中的位置进行组合。
第一个输入数据集中的第一行与第二个输入数据集中的第一行合并,依此类推。;
data data1;
input x $ @@;
datalines;
x1 x2 x3
;
run;

image.jpeg

data data2;
input y $ @@;
datalines;
y1 y2 y3 y4 y5 y6
;
run;

image.jpeg

data combined;
merge data1 data2;
run;

image.jpeg

/Example 2: Match-Merging/
/定义: 匹配合并基于 BY 变量的值将来自两个或多个输入数据集的行合并到输出数据集中的单个行中。/
data data1;
input year x $ @@;
datalines;
2011 x1 2012 x2 2013 x3 2014 x4 2015 x5
;
run;

image.jpeg

data data2;
input year y $ @@;
datalines;
2011 y1 2012 y2 2013 y3 2014 y4 2015 y5
;
run;

image.jpeg

data combined;
merge data1 data2;
by year;
run;

image.jpeg

/Example 3: Merging with a Data Set List/
data d008; job=3; emp=19; run;
data d009; job=3; sal=50; run;
data d010; job=4; emp=97; run;
data d011; job=4; sal=15; run;
data comb;
merge d008-d011;
by job;
run;
proc print data=comb;
run;

image.jpeg

/Example 4: Three Table Merge with BY Values and the IN= Data Set Option/
DATA CAFE(KEEP=NAME PLACE CNUM);
INPUT NAME $ @@;
PLACE = 'CAFE ';
CNUM = 'C' || LEFT(PUT(N,2.));
DATALINES;
ANDERSON COOPER DIXON FREDERIC FREDERIC PALMER
RANDALL RANDALL SMITH SMITH SMITH
;
RUN;

image.jpeg

DATA VENDING (KEEP=NAME PLACE VNUM);
INPUT NAME $ @@;
PLACE = 'VENDING ';
VNUM = 'V' || LEFT(PUT(N,2.));
DATALINES;
CARTER DANIELS GARY GARY HODGE PALMER RANDALL RANDALL
SMITH SMITH SPENCER SPENCER SPENCER SPENCER
;
RUN;

image.jpeg

DATA SNACK (KEEP=NAME PLACE SNUM);
INPUT NAME $ @@;
PLACE = 'SNACK ';
SNUM = 'S' || LEFT(PUT(N,2.));
DATALINES;
BARRETT COOPER DANIELS DIXON DIXON FREDERIC GARY HODGE
HODGE PALMER RANDALL RANDALL SMITH SMITH SMITH SMITH
SPENCER SPENCER
;
RUN;

image.jpeg

DATA ALL;
MERGE CAFE(IN=CAFEIN) SNACK(IN=SNACKIN) VENDING(IN=VENDIN);
BY NAME;
CIN=CAFEIN; SIN=SNACKIN; VIN=VENDIN;
RUN;
PROC PRINT;
TITLE 'MERGED DATA';
RUN;

image.jpeg

/Example 5: Two Table Merge with a BY Variable and the IN= Data Set Option/
data have_a;
input ID amount_a;
datalines;
1 10
3 15
4 20
7 15
9 12
10 14
;
run;
data have_b;
input ID amount_b;
datalines;
2 15
3 20
4 10
5 12
7 20
8 15
9 10
11 20
;
run;

data want;
merge have_a(in=inA) have_b(in=inB);
by id;
length joinType $ 2;
joinType = cats(inA, inB);
run;
proc print data=want;
run;
quit;

image.jpeg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 1.3 SAS程序的两个过程 SAS程序有两个基本模块:数据步和过程步。一个典型的SAS程序,由数据步创建SAS数...
    胡阿白阅读 468评论 0 3
  • 1.数据合并 (1)利用set语句纵向合并 data数据集; set数据集1(数据集选项)数据集2(数据集选项...
    飘乐云阅读 3,058评论 0 2
  • 一.建立数据集的基础和高级议题从最简单的建立SAS数据集开始,逐步深入,介绍如何产生新变量、如何对数据集中的变量进...
    apricoter阅读 3,836评论 1 8
  • ="'"&A2&"'"&","%sysexec md "P:\EC\data_summary&month" & e...
    寒微123阅读 4,365评论 0 0
  • 4.4 用proc print打印你的数据 基本形式:PROC PRINT; SAS默认打印最近使用的数据集,DA...
    胡阿白阅读 409评论 0 1