2014-02-16 86 views
0

只是一個普遍的問題可以說我有兩個數據集稱爲dataset1和dataset2如果我想比較數據集1的行與完整的數據集2,所以基本上比較每一行數據集1 dataset2。以下僅僅是兩個數據集比較一個數據集的每一行與另一個數據集

的例子dataSet1的

EmployeeID Name Employeer 
12345 John Microsoft 
1234567 Alice SAS 
1234565 Jim IBM 

dataSet1的

EmployeeID2 Name DateAbsent 
12345 John 25/06/2009 
12345 John 26/06/2009 
1234567 Alice 27/06/2010 
1234567 Alice 30/06/2011 
1234567 Alice 2/8/2012 
12345 John 28/06/2009 
12345 John 25/07/2009 
12345 John 25/08/2009 
1234565 Jim 26/08/2009 
1234565 Jim 27/08/2010 
1234565 Jim 28/08/2011 
1234565 Jim 29/08/2012 

我已經寫了一些編程邏輯它不是SAS代碼,這只是我的邏輯

for item in dataset1: 
    for item2 in dataset2: 
    if item.EmployeeID=item2.EmployeeID2 and item.Name=item2.Name then output newSet 

回答

1

這是一個內部連接。

proc sql noprint; 
create table output as 
select a.EmployeeId, 
     a.Name, 
     a.Employeer, 
     b.DateAbsent 
    from dataset1 as a 
    inner join 
     dataset2 as b 
    on a.EmployeeID = b.EmployeeID2 
    and a.Name = b.name; 
quit; 

我建議在PROC SQL讀取SAS documentation如果你的語法

+0

所以你不建議做一個循環 – user3305018

+0

你也可以使用數據步驟來做到這一點。 SQL是最簡單的方法,對於中等大小的數據集非常快速。如果你進入百萬分之MB,那麼我們可以談論...但是那是一個不同的問題。 – DomPazz

+0

修改了代碼以輸出一個表。 – DomPazz

1

爲此在數據步驟中的數據集需要通過變量加入上進行排序陌生(或索引)。此外,變量名稱必須相同,所以我將假設這兩個變量都是EmployeeID。

/*sort*/ 
proc sort data=dataset1; 
by EmployeeID Name; 
run; 

proc sort data=dataset2; 
by EmployeeID Name; 
run; 

data output; 
merge dataset1 (in=ds1) dataset2 (inds2); 
by EmployeeID Name; 
if ds1 and ds2; 
run; 

數據步爲您做循環。它需要有序集合,因爲它只需要傳遞數據集1遍。 if子句檢查以確保您從兩個數據集中獲得值。

+0

很酷,看起來但如果你有25數據集1中的列和數據集1中的32列,而您只想合併某些列上的數據集,例如,如果employeeId匹配和名稱匹配並且其他列相同 – user3305018

+0

只需使用數據集選項(keep = var1 var2 ...)即可省略想要的變量。我的意思是 'merge dataset1(in = ds1 keep = ...)dataset2(in = ds2 keep = ...);' – realtemper

+0

正確,使用'KEEP ='指定要保留的列或'DROP ='來指定要刪除的列。如果您希望變量進入計算範圍但不進行最終數據集,您也可以在輸出數據集上執行此操作。 – DomPazz

0

您的目標是比較兩個數據集並查看哪裏存在差異? Proc Compare會爲您做到這一點。您可以比較特定列或整個數據集。

相關問題