2014-03-18 32 views
1

我有一些變量具有指定的值。執行循環以有條件地添加值SAS

%let a_val=20; 
%let b_val=30; 
%let c_val=40; 

我也有一個看起來像這樣的數據集。

data have; 
input name $ a b c; 
cards; 
joe 1 1 2 
jim 3 2 3 
jak 5 3 5 
; 
run; 

現在,我需要創建變量P1-P5,如果他們匹配值加起來a_vals,b_vals和c_vals。例如,因爲對於a和b,jo的值爲1,所以p1將是a_val和b_val的總和,即50。對於jim和jak,p1的值都將爲零,因爲它們沒有值1。 ,j2的p2爲0,jim的爲30,joe爲40。

完成的數據集是這樣

>name p1 p2 p3 p4 p5 
>joe 50 40 0 0 0 
>jim 0 30 40 0 0 
>jak 0 0 30 0 60 

我試着像這樣do循環做到這一點:

data attempt; 
set have; 
do i=1 to 5; 
p&i=0; 
if a=i then p&i=p&i+a_val; 
if b=i then p&i=p&i+b_val; 
if c=i then p&i=p&i+c_val; 
end; 
run; 

我在正確的軌道上?

謝謝!任何幫助讚賞。

回答

2

你在這裏混合了宏代碼和數據步代碼。

一個選項:

data want; 
set have; 
array p p1-p5; 
do _i=1 to 5; 
p[_i] = sum((a=_i)*&a_val,(b=_i)*&b_val,(c=_i)*&c_val); 
end; 
run; 

你可以通過在一個陣列也是一個-C變量可以想象循環;如果是這樣,那麼您需要使用symget來獲取與數組元素關聯的宏變量的值。對於3個變量,這是不值得的。

這將是這樣的:

data want; 
set have; 
array p p1-p5; 
array var a b c; 
do _i=1 to 5; 
    do _j = 1 to dim(var); 
     p[_i] = sum(p[_i],(var[_j]=_i)*symget(cats(vname(var[_j]),'_val'))); 
    end; 
end; 
run; 
+0

謝謝你,喬。這就說得通了。我實際上有三個以上的變量,所以我可以按照你的建議看看symget。與此同時,這絕對有助於我走出困境。再次感謝。 – pyll

+0

Symget附加回答。 – Joe