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.