2014-12-29 50 views
0

我的數據集有以下變量:SAS:Do Until循環和刪除觀察

實際
預計

首先,我想創建一個新的變量「比」 = SUM(實際)/總和(預期)。對於第一個觀察,我希望這個表達式包含Actual和Expected的所有值。對於第二次迭代,我只想使用第二次觀察和之後的重複這個表達式。然後對於第三次迭代,我想包括第三次觀察和之後。

這是數據和公式在Excel中的示例。

actual expected ratio 
15  33   =SUM(A2:$A$6)/SUM(B2:$B$6) 
10  50   =SUM(A3:$A$6)/SUM(B3:$B$6) 
20  64   =SUM(A4:$A$6)/SUM(B4:$B$6) 
60  77   =SUM(A5:$A$6)/SUM(B5:$B$6) 
45  81   =SUM(A6:$A$6)/SUM(B6:$B$6) 

其次,數據集可以有任何若干意見,所以我想表達將持續到「比」低於我手動指定的值。理想情況下,該計劃還將包含創建第四個變量,其中包含從表達式中排除的觀測值數量。因此,對於第一次觀察,它將是'0',第二次觀察'1',第三次觀察'2'等等。

我想這也需要一個數組呢?提前致謝。

回答

0

你要求爲你寫代碼,這是脫離主題(而不是要求你寫代碼的幫助);然而,就技術而言,你的確有一部分有一個有趣的問題;我會解釋這種技巧,如果你需要技巧方面的幫助,請調整你的問題或問一個新問題。

如果可能的話,您要在這裏執行的操作是對數據進行反向排序。如果它沒有什麼排序,您可以添加一個觀察計數器:

data temp; 
    set have; 
    obs=_n_; 
run; 

或者你可以使用點逆序數據集,雖然這是有點慢。這是後一種技術的基本形式 - 如果您可以反向排序,那麼您不需要執行循環或設置選項。

data want; 
    do obsnum = nobs to 1 by -1; 
    set have nobs=nobs point=obsnum; 
    act_sum+actual; *accumulator for actual; 
    exp_sum+expected; *accumulator for expected; 
    ratio=act_sum/exp_sum; 
    end; 
run; 

從這裏你應該能夠解決你的問題的其餘部分。之後,您當然必須通過適當的排序方法重新排序。

+0

謝謝。我沒有發佈我的代碼,因爲我擔心我採取了錯誤的做法。我會再次嘗試你所描述的技術。 – kjay

+1

@kjay總是發佈你的代碼。尋求代碼幫助是可以的,但從頭開始尋求代碼不是。 – Joe