SAS - 连接数据集

可以使用 SET 语句连接多个 SAS 数据集以提供单个数据集。级联数据集中的观测总数是原始数据集中观测数的总和。 观察的顺序是连续的。 来自第一个数据集的所有观察结果之后是来自第二个数据集的所有观察结果,依此类推。

理想情况下,所有组合数据集都具有相同的变量,但如果它们具有不同数量的变量,则结果中会出现所有变量,而较小的数据集则缺少值。

语法

SAS 中 SET 语句的基本语法是 −

SET data-set 1 data-set 2 data-set 3.....;

以下是使用的参数说明 −

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

示例

考虑一个组织的员工数据,该数据在两个不同的数据集中可用,一个用于 IT 部门,另一个用于非 IT 部门。为了获得所有员工的完整详细信息,我们使用如下所示的 SET 语句连接两个数据集。

DATA ITDEPT; 
   INPUT empid name $ salary  ; 
DATALINES; 
1 Rick 623.3 
3 Mike 611.5 
6 Tusar 578.6 
; 
RUN; 
DATA NON_ITDEPT; 
   INPUT empid name $ salary  ; 
DATALINES; 
2 Dan 515.2 
4 Ryan 729.1 
5 Gary 843.25 
7 Pranab 632.8 
8 Rasmi 722.5 
RUN; 
DATA All_Dept; 
   SET ITDEPT NON_ITDEPT; 
RUN; 
PROC PRINT DATA = All_Dept; 
RUN;  

当执行上述代码时,我们得到以下输出。

concateate1

场景

当我们在连接的数据集中有许多变化时,变量的结果可能会有所不同,但连接数据集中的观察总数始终是每个数据集中观察的总和。 我们将在下面考虑这种变化的许多场景。


不同数量的变量

如果一个原始数据集的变量数量多于另一个,则数据集仍会合并,但在较小的数据集中,这些变量会显示为缺失。

示例

在下面的示例中,第一个数据集有一个名为 DOJ 的额外变量。 结果,第二个数据集的 DOJ 值将显示为缺失。

DATA ITDEPT; 
   INPUT empid name $ salary DOJ date9.  ; 
DATALINES; 
1 Rick 623.3 02APR2001
3 Mike 611.5 21OCT2000
6 Tusar 578.6 01MAR2009  
; 
RUN; 
DATA NON_ITDEPT; 
   INPUT empid name $ salary  ; 
DATALINES; 
2 Dan 515.2 
4 Ryan 729.1 
5 Gary 843.25 
7 Pranab 632.8 
8 Rasmi 722.5 
RUN; 
DATA All_Dept; 
   SET ITDEPT NON_ITDEPT; 
RUN; 
PROC PRINT DATA = All_Dept; 
RUN;  

当执行上述代码时,我们得到以下输出。

concateate2

不同的变量名

在这种情况下,数据集具有相同数量的变量,但它们之间的变量名称不同。在这种情况下,正常的连接将产生结果集中的所有变量,并为两个不同的变量提供缺失的结果。虽然我们可能不会更改原始数据集中的变量名称,但我们可以在我们创建的连接数据集中应用 RENAME 函数。这将产生与正常连接相同的结果,但当然是用一个新的变量名代替原始数据集中存在的两个不同的变量名。

示例

在下面的示例中,数据集 ITDEPT 的变量名为 ename,而数据集 NON_ITDEPT 的变量名为 empname。但是这两个变量都代表相同的类型(字符)。 我们在 SET 语句中应用 RENAME 函数,如下所示。

DATA ITDEPT; 
   INPUT empid ename $ salary  ; 
DATALINES; 
1 Rick 623.3 
3 Mike 611.5 
6 Tusar 578.6 
; 
RUN; 
DATA NON_ITDEPT; 
   INPUT empid empname $ salary  ; 
DATALINES; 
2 Dan 515.2 
4 Ryan 729.1 
5 Gary 843.25 
7 Pranab 632.8 
8 Rasmi 722.5 
RUN; 
DATA All_Dept; 
   SET ITDEPT(RENAME =(ename = Employee) ) NON_ITDEPT(RENAME =(empname = Employee) ); 
RUN; 
PROC PRINT DATA = All_Dept; 
RUN;  

当执行上述代码时,我们得到以下输出。

concateate3

不同的可变长度

如果两个数据集中的变量长度不同,则连接的数据集将具有其中一些数据被截断以用于具有较小长度的变量的值。如果第一个数据集的长度较小,就会发生这种情况。 为了解决这个问题,我们将更高的长度应用于两个数据集,如下所示。

示例

在下面的示例中,变量 ename 在第一个数据集中的长度为 5,在第二个数据集中的长度为 7。 连接时,我们在连接数据集中应用 LENGTH 语句将 ename 长度设置为 7。

DATA ITDEPT; 
   INPUT  empid 1-2 ename $ 3-7 salary 8-14  ; 
DATALINES; 
1 Rick  623.3 
3 Mike  611.5 
6 Tusar 578.6 
; 
RUN;
DATA NON_ITDEPT; 
   INPUT  empid 1-2 ename $ 3-9  salary 10-16 ; 
DATALINES; 
2 Dan    515.2 
4 Ryan   729.1 
5 Gary   843.25
7 Pranab 632.8 
8 Rasmi  722.5 
RUN; 
DATA All_Dept; 
   LENGTH ename $ 7   ;
   SET ITDEPT  NON_ITDEPT ; 
RUN; 
PROC PRINT DATA = All_Dept; 
RUN;  

当上面的代码执行时,我们得到如下输出。

concateate4