SAS - 连接数据集

可以使用 SET 语句连接多个SAS数据集以提供单个数据集.连接数据集中的观察总数是原始数据集中观察数的总和.观察的顺序是顺序的.来自第一个数据集的所有观察结果都跟随来自第二个数据集的所有观察结果,依此类推.

理想情况下,所有组合数据集都具有相同的变量,但如果它们具有不同的数字变量,然后在结果中出现所有变量,缺少较小数据集的值.

语法

SET语句的基本语法在SAS中是 :

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