SAS - 合併資料集



多個 SAS 資料集可以基於特定的公共變數合併以生成單個數據集。這是使用 **MERGE** 語句和 **BY** 語句完成的。合併資料集中的觀測總數通常小於原始資料集中觀測總數的總和。這是因為當公共變數的值匹配時,來自兩個資料集的變數被合併為一個記錄。

下面給出合併資料集的兩個前提條件:

  • 輸入資料集必須至少有一個公共變數才能合併。
  • 輸入資料集必須按將用於合併的公共變數排序。

語法

SAS 中 MERGE 和 BY 語句的基本語法如下:

MERGE Data-Set 1 Data-Set 2
BY Common Variable

以下是所用引數的說明:

  • **資料集1,資料集2** 是一個接一個寫出的資料集名稱。

  • **公共變數** 是根據其匹配值將資料集合並的變數。

資料合併

讓我們透過一個例子來理解資料合併。

示例

考慮兩個 SAS 資料集,一個包含員工 ID、姓名和工資,另一個包含員工 ID 和部門。在這種情況下,為了獲取每個員工的完整資訊,我們可以合併這兩個資料集。最終的資料集每個員工仍然只有一條觀測值,但它將包含工資和部門變數。

# Data set 1	
ID NAME SALARY	
1 Rick 623.3		 
2 Dan 515.2 		
3 Mike 611.5 		
4 Ryan 729.1 
5 Gary 843.25 
6 Tusar 578.6 
7 Pranab 632.8 
8 Rasmi 722.5 

# Data set 2
ID DEPT
1 IT 
2 OPS
3 IT 
4 HR 
5 FIN 
6 IT 
7 OPS
8 FIN 

# Merged data set
ID NAME SALARY DEPT	
1 Rick 623.3	IT 		 
2 Dan 515.2 	OPS	
3 Mike 611.5 	IT 	
4 Ryan 729.1    HR 
5 Gary 843.25   FIN 
6 Tusar 578.6   IT 
7 Pranab 632.8  OPS
8 Rasmi 722.5   FIN 

上述結果是透過使用以下程式碼實現的,其中公共變數 (ID) 用於 BY 語句中。請注意,兩個資料集中的觀測值都已按 ID 列排序。

DATA SALARY; 
   INPUT empid name $ salary  ; 
DATALINES; 
1 Rick 623.3		 
2 Dan 515.2 		
3 Mike 611.5 		
4 Ryan 729.1 
5 Gary 843.25 
6 Tusar 578.6 
7 Pranab 632.8 
8 Rasmi 722.5 
;
RUN; 
DATA DEPT; 
   INPUT empid dEPT $ ; 
DATALINES; 
1 IT 
2 OPS
3 IT 
4 HR 
5 FIN 
6 IT 
7 OPS
8 FIN 
;
RUN; 
DATA All_details;
MERGE SALARY DEPT;
BY (empid);
RUN;
PROC PRINT DATA = All_details; 
RUN;  

匹配列中的缺失值

在某些情況下,公共變數的一些值在資料集之間可能不匹配。在這種情況下,資料集仍然會合並,但在結果中會給出缺失值。

示例

考慮工資資料集缺失員工 ID 3,部門資料集缺失員工 ID 6 的情況。應用上述程式碼後,我們得到以下結果。

ID NAME SALARY DEPT	
1 Rick 623.3	IT 		 
2 Dan 515.2 	OPS	
3 .		.		IT
4 Ryan 729.1    HR 
5 Gary 843.25   FIN 
6 Tusar 578.6   .
7 Pranab 632.8  OPS
8 Rasmi 722.5   FIN 

僅合併匹配項

為了避免結果中的缺失值,我們可以考慮只保留公共變數值匹配的觀測值。這是透過使用 **IN** 語句實現的。需要更改 SAS 程式的 merge 語句。

示例

在下面的示例中,**IN=** 值僅保留來自兩個資料集 **SALARY** 和 **DEPT** 的值匹配的觀測值。

DATA All_details;
MERGE SALARY(IN = a) DEPT(IN = b);
BY (empid);
IF a = 1 and b = 1;
RUN;
PROC PRINT DATA = All_details; 
RUN;  

執行上述包含更改部分的 SAS 程式後,我們將獲得以下輸出。

1 Rick 623.3	IT 		 
2 Dan 515.2 	OPS	
4 Ryan 729.1    HR 
5 Gary 843.25   FIN 
7 Pranab 632.8  OPS
8 Rasmi 722.5   FIN 
廣告