SAS - 合并数据集

可以根据特定的公共变量合并多个SAS数据集,以提供单个数据集.这是使用 MERGE 语句和 BY 语句完成的.合并数据集中的观察总数通常小于原始数据集中观察数的总和.这是因为当公共变量的值匹配时,两个数据集的变量合并为一个记录.

合并下面和下面给出的数据集有两个先决条件;

  • 输入数据集必须至少有一个要合并的公共变量.

  • 输入数据集必须按将用于合并的公共变量排序.

语法

SAS中MERGE和BY语句的基本语法是 :

MERGE Data-Set 1 Data-Set 2
BY Common Variable

以下是所用参数的描述 :

  • Data-set1,Data-set2 是一个接一个写的数据集名称.

  • 普通变量是基于其合并数据集的匹配值的变量.

数据合并

让我们通过一个例子来理解数据合并.

示例

考虑两个SAS数据集,其中一个包含带有名称的员工ID和薪水和另一个包含员工ID和员工ID的员工ID.在这种情况下,为了获得每个员工的完整信息,我们可以合并这两个数据集.最终数据集仍然会为每位员工提供一次观察,但它将包含薪水和部门变量.

# Data set 1	
ID NAME SALARY	
1 Rick 623.3		 
2 Dan 515.2 		
3 Mike 611.5 		
4 Ryan 729.1 
5 Gary 843.25 
6 Tusar 578.6 
7 Pranab 632.8 
8 Rasmi 722.5 

# Data set 2
ID DEPT
1 IT 
2 OPS
3 IT 
4 HR 
5 FIN 
6 IT 
7 OPS
8 FIN 

# Merged data set
ID NAME SALARY DEPT	
1 Rick 623.3	IT 		 
2 Dan 515.2 	OPS	
3 Mike 611.5 	IT 	
4 Ryan 729.1    HR 
5 Gary 843.25   FIN 
6 Tusar 578.6   IT 
7 Pranab 632.8  OPS
8 Rasmi 722.5   FIN

上述结果是通过使用以下代码实现的,其中公共变量(ID)用于BY声明.请注意,两个数据集中的观察结果已经在ID列中排序.

DATA SALARY; 
   INPUT empid name $ salary  ; 
DATALINES; 
1 Rick 623.3		 
2 Dan 515.2 		
3 Mike 611.5 		
4 Ryan 729.1 
5 Gary 843.25 
6 Tusar 578.6 
7 Pranab 632.8 
8 Rasmi 722.5 
;
RUN; 
DATA DEPT; 
   INPUT empid dEPT $ ; 
DATALINES; 
1 IT 
2 OPS
3 IT 
4 HR 
5 FIN 
6 IT 
7 OPS
8 FIN 
;
RUN; 
DATA All_details;
MERGE SALARY DEPT;
BY (empid);
RUN;
PROC PRINT DATA = All_details; 
RUN;

匹配列中缺少值

可能存在公共变量的某些值不匹配的情况数据集.在这种情况下,数据集仍然会合并,但会在结果中显示缺失值.

示例


考虑数据集工资中缺少员工ID 3的情况员工ID 6缺少表单数据集DEPT.当上述代码被应用时,我们得到以下结果.

ID NAME SALARY DEPT	
1 Rick 623.3	IT 		 
2 Dan 515.2 	OPS	
3 .		.		IT
4 Ryan 729.1    HR 
5 Gary 843.25   FIN 
6 Tusar 578.6   .
7 Pranab 632.8  OPS
8 Rasmi 722.5   FIN

仅合并匹配

至避免结果中的缺失值,我们可以考虑仅保留具有公共变量的匹配值的观察值.这是通过使用 IN 语句实现的.需要更改SAS程序的合并声明.

示例

在下面的示例中, IN = value仅保留来自数据集 SALARY DEPT 的值匹配的观察值.

DATA All_details;
MERGE SALARY(IN = a) DEPT(IN = b);
BY (empid);
IF a = 1 and b = 1;
RUN;
PROC PRINT DATA = All_details; 
RUN;

执行上述SAS程序后,我们得到以下输出.

1 Rick 623.3	IT 		 
2 Dan 515.2 	OPS	
4 Ryan 729.1    HR 
5 Gary 843.25   FIN 
7 Pranab 632.8  OPS
8 Rasmi 722.5   FIN