2013-02-03 60 views
0
data tempx1; 
    input ID; 
    cards; 
    1 
    2 
    3 
    4 
    ; 
run; 

data tempx2; 
    set tempx1; 
    array diag{4} d1 d2 d3 d4 (1,2,3,4); 
    do i = 1 to 4; 
     if diag[i] = ID then diag[i] = 1; else diag[i] = 0; 
    end; 
    drop i; 
run; 

我想要1在數組的對角線上,我在這裏做錯了什麼?如何根據SAS中的另一個變量修改數組值?

回答

0

當您使用一組值初始化一個數組時,您給它的值只設置一次。他們不會爲數據集的每個隱式循環重新設置。

因此您必須明確地做到這一點。下面的代碼會爲你工作:

data tempx2; 
set tempx1; 
array diag{4} d1 d2 d3 d4 (1,2,3,4); 

do i = 1 to 4; 
diag[i] = i; 
end; 

do i = 1 to 4; 
if diag[i] = ID then diag[i] = 1; else diag[i] = 0; 
end; 

drop i; 

run; 

這裏是一個演示這應該更容易理解爲什麼這個工程:

data test; 
set tempx1; 
array diag{4} d1 d2 d3 d4 (1,2,3,4); 
put _all_; 
output; 
if _n_ = 1 then diag{1} = 10; 
if _n_ = 3 then diag{1} = 20; 
put _all_; 
output; 
run; 
+0

感謝您的及時幫助!雖然我已經簡化了我的問題,但你說什麼初始值只能設置一次纔有意義。我的初始值實際上並不是像1,2,3這樣的好孩子,而是一些不規則的數字或字符串,所以我創建一個宏變量並首先使用類似於您添加的代碼的方式設置diag [i]的值,並且然後做比較。問題解決了!這裏的教訓是關於初始值只設置一次!!謝謝! – Joven

0

我認爲你有一個簡單的解決方案,因爲你真的不是活得試圖使用初始化的值。你只是沒有做適當的比較。與我比較,不要與diag [i]比較。

data tempx2; 
    set tempx1; 
    array diag{4} d1 d2 d3 d4 (1,2,3,4); 
    do i = 1 to 4; 
     if i = ID then diag[i] = 1; else diag[i] = 0; 
    end; 
    drop i; 
run; 
+0

感謝您的幫助!這是一個甜蜜的解決方案。然而,因爲我簡化了我的問題,直接比較i和ID並不像通過RobinL提供的解決方案那樣一般,所以我標記了第一個解決方案!再次感謝! – Joven

相關問題