2016-06-20 101 views
0

這是我第一次在這個論壇上提問。我已經使用SAS/Proc SQL大約4年了,但我不是一個代碼Jedi,所以請給出詳細的答案,並且對於數組來說是相當新的,所以請原諒,如果我的問題沒有詳細解釋。一般來說,我是100%舒適的建築/使用簡單的陣列。但我有一個非常具體的挑戰,我無法弄清楚......難以置信的話,所以這可能會長時間的囉嗦,但這裏...SAS數組/循環迭代變量

對於基本瞭解我想要完成的事情,它有點類似於第1個月的簡單貸款攤銷,餘額爲原始貸款金額,比如說是10,000美元,第2個月的餘額是orig_ln_amt減去任何新的本金/利息支付減去任何額外支付導致可以說9500美元,第3個月結果9000美元等....易於1帳戶,但我建立一個數組,實際上給出了所有活動帳戶在將來每個月彙總到一起時預測的總餘額餘額,所以我使用的數組大小發生了變化每個月基於帳戶的年齡。

下面是我希望將工作的一些示例代碼:

DATA SAMPLE; 
    SET INPUT_DATA; 'HAS EACH OF THE 3 INPUT ARRAYS LAID OUT SIDE BY SIDE BY SIDE 
    ARRAY_ONE {193} ARRAY_ONE1-ARRAY_ONE193; 
    ARRAY_TWO {97} ARRAY_TWO1-ARRAY_TWO97; 
    ARRAY_THREE {97} ARRAY_THREE1-ARRAY_THREE97; 
    OUTPUT_ARRAY {193} OUTPUT_ARRAY1-OUTPUT_ARRAY193; 'PORTFOLIO BALANCE EACH FUTURE MONTH 
    DO I = 1 TO 193; 
    OUTPUT_ARRAY[I] = sum(of ARRAY_ONE[I]-ARRAY_ONE193) - sum(of ARRAY_TWO[I]-ARRAY_TWO97) - sum(of ARRAY_THREE[I]-ARRAY_THREE97); 
    END; 
RUN; 

問題是SAS不喜歡陣列計算裏面的[I [迭代參考。我也試過&我基於另一個在線用戶收到的解決方案似乎是類似的問題。該邏輯是有道理的,似乎像它應該在理論工作,但不...

因此,我們不得不手動操作和每個代碼193次計算的:

OUTPUT_ARRAY1 = sum(of ARRAY_ONE1-ARRAY_ONE193) - sum(of ARRAY_TWO1-ARRAY_TWO97) - sum(of ARRAY_THREE1-ARRAY_THREE97); 
OUTPUT_ARRAY2 = sum(of ARRAY_ONE2-ARRAY_ONE193) - sum(of ARRAY_TWO2-ARRAY_TWO97) - sum(of ARRAY_THREE2-ARRAY_THREE97); 
    ... 
OUTPUT_ARRAY97 = sum(of ARRAY_ONE97-ARRAY_ONE193) - sum(of ARRAY_TWO97-ARRAY_TWO97) - sum(of ARRAY_THREE97-ARRAY_THREE97); 
OUTPUT_ARRAY98 = sum(of ARRAY_ONE98-ARRAY_ONE193); 
    ... 
OUTPUT_ARRAY193 = sum(of ARRAY_ONE193-ARRAY_ONE193); 

好像有應該是一個簡單的解決方案,但我們無法弄清楚。在此先感謝您提供的任何幫助。

+1

分開回答你的問題:我會*強烈*鼓勵你重新配置你的數據結構。如果您在這裏每個時間段有一行,SAS(以及其他任何非矩陣語言)將會使_Far_更好。 – Joe

+0

數組中包含什麼?餘額?利益?不同的月份?爲什麼不同長度?請張貼一小段數據。我看到一個聚合的SQL查詢解決方案。 – Parfait

+0

好問題...有點難以回答,因爲我的貸款比較例子不是一個完美的比較,它在細節上有點混亂。輸出=剩餘餘額(出局193 mos); Array1 =總損失$(193mos); Array2 =收益(97mos); Array3 =定期付款(97mos)。 陣列是不同的長度,因爲還有其他事件發生在投資組合的生命... – CraigD

回答

1

當編譯數據步驟時,會計算像VAR1-VAR20這樣的變量列表。您嘗試使用ARRAY[I]-variable193作爲變量列表不會飛行。只需使用另一個DO循環。

DO I = 1 TO dim(output_array); 
    output_array(i)=0; 
    DO J=I to dim(array_one); 
    output_array(i)= sum(output_array(i),array_one(j)); 
    END; 
    DO J=I to dim(array_two); 
    output_array(i)= sum(output_array(i),array_two(j)); 
    END; 
    DO J=I to dim(array_three); 
    output_array(i)= sum(output_array(i),array_three(j)); 
    END; 
END; 
+0

哦,我完全誤讀他在那裏做什麼。好點子。 – Joe

+0

您可能仍然希望檢查數組2/3的模糊,因爲它們比數組短。 – Joe

+0

因此,爲每個輸入數組分別做單獨的循環。 – Tom

2

因此,你有三組變量與原則調整。您有一個起始餘額,並且您想通過應用調整來計算各種中間餘額。

首先通過使數組具有相同的大小來簡化您的問題。新的變量將會丟失。如果您確實有這些變量,但不想將它們包含在計算中,請將它們從輸入數據集中刪除。請注意,如果您有名爲ONE1到ONE193的變量,那麼只需使用此語句array one(193);就可以創建一個名爲ONE的數組。

其次簡化您的算術以更加緊密地匹配您的問題描述。它看起來像算法是,下一個餘額是基於以前的餘額減去所有的調整。包含零來處理所有調整值缺失的情況。

%let n=193; 
data want; 
    set have; 
    array one (&n); 
    array two (&n); 
    array three (&n); 
    array balance Initial_balance balance1-balance&n; 
    do i=1 to dim(balance)-1; 
    balance(i+1)=balance(i)-sum(0,one(i),two(i),three(i)); 
    end; 
run; 
+0

謝謝Tom。幾乎正是我想出來的,結果又回到了舊代碼中......非常感謝你的幫助! – CraigD