2015-06-16 30 views
0

我對以下步驟有些困惑。:SAS中的in =選項

下面是代碼:

data data1; 
merge data2 data3 (in=inb); 
by ID; 
if inb; 
run; 

我會很感激,如果有人能告訴我是什麼的= INB在這裏做。

回答

3
DS_A   DS_B 

ID VAR1  ID VAR2 
A X  A X 
B X  B X 
C X  D X 

data want; 
merge ds_a ds_b; 
by id; 
run; 

將產生此

WANT: 

ID VAR1 VAR2 
A X X 
B X X 
C X 
D  X 

如果添加IN =選項添加一個臨時的和隱藏的變量,它是1時,觀察是存在於該數據集中,否則爲0,這樣的:

DS_A   DS_B 

ID VAR1  ID VAR2 
A X  A X 
B X  B X 
C X  D X 

data want; 
merge ds_a (in=frs) ds_b (in=scn); 
by id; 
run; 

WANT: 
ID VAR1 VAR2 FRS SCN 
A X X  1 1 
B X X  1 1 
C X   1 0 
D  X  0 1 

所以,你可以用這個隱藏變量來觀察從一個數據集或從兩個或只有一個等玩...

if frs; ---> keep ID=A B C 
if scn; ---> keep ID=A B D 
if frs and scn ---> keep ID=A B 
if frs and not scn --> keep ID=C 
etc.. 
+0

非常好的和詳細的解釋 – Joe

0

因爲選項(in = inb)在data3之後,它被引用到這個數據集中。 因此,如果data1中存在該觀察結果,則將有一個布爾變量,該值在data1(最終數據集)中爲1,否則爲0。

Data2 Data3 
ID  ID 
A  A 
B  B 
C  D 

您將有

Data3 
ID INB 
A 1 
B 1 
C 0 
D 1 

添加語句,如果INB;你將只保留意見與INB爲1(觀察從數據3推出)

Data3 
ID 
A 
B 
D 
0

功能,

merge data2 data3 (in=inb); 
by ID; 
    if inb; 

相同的權利在SQL連接。

從技術上講,對於在data3中找到的每個記錄,「inb」是一個0/1標誌,設置爲「1」。 「如果inb」是「如果inb爲真[然後保留記錄]」的簡寫,並且對於數字字段「真」意味着大於零。

1

in=選項的行爲的另一個方面,我不認爲其他人已經提到過 - 如果合併兩個不同的數據集,兩個數據集使用相同的in=變量,而一行是一個而不是另一個,值1優先於值0.例如

data test; 
    merge sashelp.class(where = (sex = 'F') in = a) 
      sashelp.class(where = (sex = 'M') in = a); 
    by name;   
    put _all_; 
run;  

在這種情況下,即使每行僅存在於其中一個輸入數據集中,每行的a = 1。