SAS - 合并数据集



多个 SAS 数据集可以基于特定的公共变量合并以生成单个数据集。这是使用 **MERGE** 语句和 **BY** 语句完成的。合并数据集中的观测总数通常小于原始数据集中观测总数的总和。这是因为当公共变量的值匹配时,来自两个数据集的变量被合并为一个记录。

下面给出合并数据集的两个前提条件:

  • 输入数据集必须至少有一个公共变量才能合并。
  • 输入数据集必须按将用于合并的公共变量排序。

语法

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

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

以下是所用参数的说明:

  • **数据集1,数据集2** 是一个接一个写出的数据集名称。

  • **公共变量** 是根据其匹配值将数据集合并的变量。

数据合并

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

示例

考虑两个 SAS 数据集,一个包含员工 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 的情况。应用上述代码后,我们得到以下结果。

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 程序的 merge 语句。

示例

在下面的示例中,**IN=** 值仅保留来自两个数据集 **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 
广告