2012-10-25 28 views
0

例如,我有,我通過迭代,並適用於線性函數,如圖所示的各種延遲數據:(函數是這裏只是一個例子)如何在數據步驟的循環中引用當前行/觀察編號?

data latency; 
input lat1 - lat20; 
array cost[20]; 
array lat[20]; 
do x = 1 to 20; 
cost[x] = lat[x] * 1.875; 
end; 
drop x; 
datalines; 
0.42 0.85 0.59 0.06 0.21 0.35 0.1 0.08 0.85 0.53 0.81 0.44 0.47 0.2 0.99 0.32 0.18 0.87 0.33 0.84 
0.11 0.83 0.02 0.59 0.74 0.65 0.76 0.45 0.57 0.22 0.2 0.13 0.42 0.15 0.05 0.51 0.48 0.95 0.39 0.92 
0.8 0.9 0.65 0.29 0.77 0.0 0.24 0.05 0.16 0.72 0.58 0.9 0.35 0.63 0.79 0.41 0.73 0.36 0.82 0.16 
0.74 0.21 0.57 0.73 0.83 0.78 0.77 0.92 0.13 0.39 0.52 0.14 0.1 0.77 0.68 0.99 0.26 0.37 0.97 0.83 
; 
run; 

如何可以保存一個變量與當前在循環的每次迭代中使用觀察數,以便稍後在計算中使用它?

我知道proc print會自動打印觀察編號,但是如何訪問它並將其存儲到數據步驟中的變量?有沒有辦法做到這一點,薩斯一行一行地讀取數據?

我試過了,但對於每個觀察,obs變量都是2。

data latency; 
input lat1 - lat20; 
obs = 1;     * ADDED LINE; 
array cost[20]; 
array lat[20]; 
do x = 1 to 20; 
cost[x] = lat[x] * 1.875; 
end; 
obs = obs + 1;   * ADDED LINE; 
drop x; 
datalines; 
0.42 0.85 0.59 0.06 0.21 0.35 0.1 0.08 0.85 0.53 0.81 0.44 0.47 0.2 0.99 0.32 0.18 0.87 0.33 0.84 
0.11 0.83 0.02 0.59 0.74 0.65 0.76 0.45 0.57 0.22 0.2 0.13 0.42 0.15 0.05 0.51 0.48 0.95 0.39 0.92 
0.8 0.9 0.65 0.29 0.77 0.0 0.24 0.05 0.16 0.72 0.58 0.9 0.35 0.63 0.79 0.41 0.73 0.36 0.82 0.16 
0.74 0.21 0.57 0.73 0.83 0.78 0.77 0.92 0.13 0.39 0.52 0.14 0.1 0.77 0.68 0.99 0.26 0.37 0.97 0.83 
; 
run; 

proc print data=latency; 
run; 

這是一個小例子,但在現實中,我不能簡單地添加存儲的行號到每個數據線的開始一個新的變量,並在閱讀它,這不是實際動手數據集。

回答

2

您只需添加一條retain語句,以便SAS在每次新觀察時都不會將obs重置爲0。

data latency; 
retain obs 0; 
obs = obs + 1; 
... 
run; 
+1

或者,執行此操作:'數據延遲; obs + 1;'寫入沒有等於它會自動保留。 – Joe

+0

@Joe但是,如果我在循環中添加了'obs = obs + 1',它只會取值20,40,60,80等。不應該爲每個變量增加一次'retain'語句,每個數據行,如果它在循環內? –

+0

如果你把它放在循環中而不輸出它,你不會得到20個不同的值。 RETAIN與增量沒有任何關係 - 它只是說,當你點擊數據步進循環結束時不會清除數值。在你的情況下,你需要一個OUTPUT,如果你想每個值一行而不是每行20個值。我認爲你對你想要的東西不夠清楚 - 你收到的兩個答案都回答這個問題與我的閱讀方式略有不同,但我無法弄清楚你想要什麼。嘗試充實它,也許舉一個例子,如果它是正確的,它會是什麼樣子。 – Joe

1

您的第一次嘗試非常接近。再試一次,但這次替換此行:

obs = 1;     * ADDED LINE; 

有了這個:

retain obs 0;   * ADDED LINE; 

這樣,你的obs變量將在您的整個數據集,每次保留,而不是被重置爲1。