SAS – 连接数据集
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;
执行上述代码后,我们得到以下输出。
场景
当我们在串联数据集中有许多变化时,变量的结果可能不同,但串联数据集中的观察总数始终是每个数据集中观察的总和。我们将在下面考虑这种变化的许多场景。
不同数量的变量
如果原始数据集之一的变量数多于另一个,则数据集仍会合并,但在较小的数据集中,这些变量似乎缺失。
例子
在下面的示例中,第一个数据集有一个名为 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;
执行上述代码后,我们得到以下输出。
不同的变量名
在这种情况下,数据集具有相同数量的变量,但它们之间的变量名称不同。在这种情况下,正常串联将产生结果集中的所有变量,并为两个不同的变量提供缺失的结果。虽然我们可能不会更改原始数据集中的变量名称,但我们可以在我们创建的连接数据集中应用 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;
执行上述代码后,我们得到以下输出。
不同的可变长度
如果两个数据集中的变量长度与连接的数据集不同,则连接的数据集中的值会为长度较小的变量截断一些数据。如果第一个数据集的长度较小,就会发生这种情况。为了解决这个问题,我们将更高的长度应用于两个数据集,如下所示。
例子
在下面的示例中,变量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;
执行上述代码后,我们得到以下输出。