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;  

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

连接1

应用场景

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

不同数量的变量

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

例子

在下面的示例中,第一个数据集有一个名为 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;  

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

连接2

不同的变量名

在这种情况下,数据集具有相同数量的变量,但变量名称不同。在这种情况下,正常串联将产生结果集中的所有变量,并为两个不同的变量提供缺失的结果。虽然我们不能更改原始数据集中的变量名称,但我们可以在我们创建的串联数据集中应用 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;  

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

连接3

不同的可变长度

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

例子

在下面的示例中,变量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;  

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

连接4