Sas 简明教程

SAS - Merge Data Sets

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

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

  1. 输入数据集必须至少有一个共同变量可用于合并。

  2. 必须根据用于合并的公共变量对输入数据集进行排序。

Syntax

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

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

以下是所用参数的描述 -

  1. Data-set1,Data-set2 是连续编写的多个数据集名称。

  2. Common Variable 是变量,数据集将根据其匹配值进行合并。

Data Merging

让我们借助示例了解数据合并。

Example

考虑两个 SAS 数据集,一个包含附有姓名和工资的员工 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

可以使用在 BY 语句中使用公共变量 (ID) 的以下代码来实现上述结果。请注意,两个数据集中的观测值已经在 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;

Missing Values in the Matching Column

在某些情况下,公共变量的某些值在数据集中可能无法匹配。在这种情况下,数据集仍然可以合并,但在结果中会出现缺失值。

Example

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

Merging only the Matches

为了避免结果中的缺失值,我们可以考虑仅保留公共变量值匹配的观测值。可以通过使用 IN 语句实现。需要更改 SAS 程序的合并语句。

Example

在以下示例中, IN = 值仅保留来自数据集 SALARYDEPT 的值匹配的观测值。

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