📅  最后修改于: 2021-01-08 14:16:10             🧑  作者: Mango
在上一个主题中,我们学习了以不同的文件格式编写SAS数据集。现在,在本主题中,我们将学习如何使用SAS编程语言将多个数据集连接为单个数据集。
假设您在不同的数据集中有许多观测值,并且需要在一个数据集中收集所有观测值,然后您将做什么。为此,SAS可以帮助您将不同的数据集连接为一个数据集。
SET语句用于将不同的数据集连接为一个数据集。串联数据集存储原始数据集的所有观测值之和。串联数据集中的所有观察遵循这样的正确存储顺序,首先是第一数据集的所有观察,其次是第二数据集的所有观察,依此类推。
理想情况下,所有组合数据集应具有相同数量的变量,但是如果它们具有不同数量的变量,则所有变量都将出现在结果中,而小型数据集的值将丢失。
SET data-set 1 data-set 2 data-set 3 data-set 4........;
哪里,
Set:这是一条语句,用于将不同的数据集连接为一个数据集。
数据集1数据集2:这些是要串联的数据集的名称。
现在,让我们通过一个示例来了解如何连接数据集:
让我们考虑一个组织的员工数据,该数据有两个单独的数据集,一个用于培训部门,另一个用于非培训部门。为了获得所有员工的全部详细信息,我们需要将两个数据集连接起来。为此,我们使用SET语句。
DATA Training_Dept;
INPUT empid name $ salary;
DATALINES;
101 Avinash 20000
103 Meera 25000
106 Tushar 27000
;
RUN;
DATA NON_Training_Dept;
INPUT empid name $ salary;
DATALINES;
102 Mitali 23000
104 Rohan 40000
105 Akanksha 45000
107 Prabhat 49000
108 Mohan 62000
RUN;
DATA All_Dept;
SET Training_Dept NON_Training_Dept;
RUN;
PROC PRINT DATA = All_Dept;
RUN;
现在,在SAS studio中执行以上代码:
输出:
从输出中可以看到,两个数据集都连接在一个表中。
在某些情况下,数据集的变量有所不同。在这种类型的不同情况下,级联数据集中的观测总数始终等于每个数据集中的观测总数。让我们看看数据集变量具有变化的不同情况。
如果所有数据集的变量数都不相等,那么数据集仍然会串联在一起,但是多余变量的值会在小数据集中消失。让我们通过一个例子来理解。
例如:
有两个要连接的数据集。一个是training_department ,它具有五个变量,即empid ,名称,薪水,地址和课程,另一个是non_training_department ,它具有三个变量,即empid , name和薪水。在输出中,地址和路线的值将对于数据集non_training_department消失。
DATA Training_Dept;
INPUT empid name $ salary address$ course$;
DATALINES;
101 Avinash 20000 delhi msoffice
103 Meera 25000 bhopal internet
106 Tushar 27000 indore database
;
RUN;
DATA NON_Training_Dept;
INPUT empid name $ salary;
DATALINES;
102 Mitali 23000
104 Rohan 40000
105 Akanksha 45000
107 Prabhat 49000
108 Mohan 62000
RUN;
DATA All_Dept;
SET Training_Dept NON_Training_Dept;
RUN;
PROC PRINT DATA = All_Dept;
RUN;
现在,在SAS studio中执行以上代码:
输出:
从输出中可以看到,数据集non_training_department缺少address和course的值。
当所有数据集包含相同数量的变量,但名称不同时,在这种情况下,我们可以通过应用Rename Statement连接数据集。如果我们不使用Rename语句,那么SAS仍将连接数据集,但是对于不同的名称变量,它将产生丢失的结果。我们可以将Rename语句与为连接而创建的数据集一起应用。让我们通过一个例子来理解。
例如:
在下面的示例中,我们有两个数据集,一个是Training_Dept ,另一个是Non_Training_Dept 。两个数据集都有一个引用相同值(即名称)的变量,但是在两个数据集中它用不同的名称声明。在数据集Training_Dept中,变量通过名称声明,而在数据集Non_Training_Dept中,通过ename声明。为了串联它们,我们在串联数据集All_Dept上应用RENAME语句。
DATA Training_Dept;
INPUT empid name $ salary;
DATALINES;
101 Avinash 20000
103 Meera 25000
106 Tushar 27000
;
RUN;
DATA NON_Training_Dept;
INPUT empid ename $ salary ;
DATALINES;
102 Mitali 23000
104 Rohan 40000
105 Akanksha 45000
107 Prabhat 49000
108 Mohan 62000
RUN;
DATA All_Dept;
SET Training_Dept(RENAME =(name = Employee) ) NON_Training_Dept(RENAME =(ename = Employee) );
RUN;
PROC PRINT DATA = All_Dept;
RUN;
现在,在SAS studio中执行以上代码:
输出:
正如我们在输出中看到的那样,雇员名称由变量Employee串联。
如果数据集中变量的长度不同,则可以通过应用Length语句将它们连接起来。当在连接的数据集中应用Length语句时,我们应该考虑使用更大的长度,而不是考虑较小的长度,因为SAS将生成更长的容器,可以轻松接受较小的长度值。
例如:
在下面的示例中,变量名称在Training_Dept数据集中具有5的长度,在Non_Training_Dept数据集中具有7的长度。串联时,我们将长度设为8。
DATA Training_Dept;
INPUT empid 1-2 name $ 3-7 salary 8-14 ;
DATALINES;
1 Richa 632.3
3 Micha 521.5
6 Tusha 548.6
;
RUN;
DATA NON_Training_Dept;
INPUT empid 1-2 name $ 3-9 salary 10-16 ;
DATALINES;
2 Dany 515.2
4 Rian 629.1
5 Gury 743.25
7 Pranab 532.8
8 Rasmi 522.5
RUN;
DATA All_Dept;
LENGTH name $ 8 ;
SET Training_Dept NON_Training_Dept ;
RUN;
PROC PRINT DATA = All_Dept;
RUN;
在SAS Studio中执行以上代码:
输出:
正如我们在输出中看到的那样,变量名由较高的字符长度(即8)连接在一起。