2012-05-30 110 views
0

我只想在有一定的值時創建新的虛擬變量。SAS宏循環和虛擬變量

這是我的原始數據示例。

ID A1 A2... A10 
1 10 1 5 
2 20 8 4 
... 
... 

我想在這些屬性中存在某個值時添加虛擬變量。 例如,ID 1具有主體 「10」,一個新的變量,ADD10將是1 ..

ID A1 A2.. A10 Add1..Add4 Add5...Add20 

1 10 1.. 5 1 ...0 1 ... 0 

2 20 8.. 4 0 ...1 0 ...  1 

... 

這是我的代碼..

%MACRO DO_LIST; 
%DO I=1 %TO 20; 

data aaaa; 
set aa33; 
if A1 =i or 
A2 =i or 
A3 =i or 
... 
A10 =i then Add&I=I ; 
RUN; 
%END; 
%MEND DO_LIST; 
%DO_LIST; 

然而,我的結果只有Add20,這是最後一個變量.. 我覺得我在循環語句中犯了一個錯誤。你介意幫我嗎? 在此先感謝。

回答

1

現在,您始終使用與aaaa的輸入相同的數據集,並且您沒有在每個循環中更改此數據集。因此,你總是會得到Add20,因爲這是循環的最後一次迭代所要做的。

一個簡單的修復到這將是:

data append; 
set aa33; 
run; 

%MACRO DO_LIST; 
%DO I=1 %TO 20; 
data append; 
set append; 
if A1 =i or 
A2 =i or 
A3 =i or 
..... 
A10 =i then Add&I=I ; 
RUN; 
%END; 
%MEND DO_LIST; 
%DO_LIST; 

你要非常列每個循環運行,而不是與原始數據集(aa33)完全取代它的時間和結果添加到您的數據集只有當前的迭代。

如果你知道規定的上限是20,下面應該沒有宏觀

data test; 
set aa33; 
array add[20] 1. add1 - add20; 
array a[*] a:; 

do i = 1 to dim(a); 
    value = a[i]; 
    add[value] = 1; 
end; 
run; 

工作,我認爲這是你在找什麼,它會幫助,如果你至少填寫前兩個整行的例子。

+0

謝謝soooooo多!! – user976856