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
广告

© . All rights reserved.