2017-03-29 119 views
0

我正在觸摸一些我編寫的SAS代碼,發現我希望更有效地執行一段代碼。我有一個名爲「預測」的時間序列數據集,它只包含日期和給定日期的「預測」變量。SAS:在數據步驟中使用宏變量作爲數字

我寫一個簡單的代碼塊藉此變量和基本上砍它成一系列的變量,每一個代表一個日期:

data forecasts; 
set forecasts; 
    obs=_n_; 
    array r(241); 
    do i=1 to dim(r); 
    if obs=i then r(i)=Forecast; 
    end; drop i; drop obs; drop forecast; 
run; 

然而,「R(241)」的一部分這段代碼真的讓我很煩惱。我已經有對應的時候,我需要執行此操作(稱爲「N」)的數量的宏變量,我寧願只是將其插入陣列宣佈直接,是這樣的:

array r(&n) 

但是,宏變量顯然被認爲是文本,所以即使我設法將宏變量導入到數據步驟中,變量r(& n)也不起作用,因爲它不會讀取'n'作爲數字。除了將整個數據步驟包裝到更廣泛的宏之外,我怎樣才能將'n'拉入數據步驟,然後將其轉換爲數字,以便此操作正常工作?

回答

2

聲明:

array r(&n) ; 

要細,假設宏變量被定義,並且具有一個整數值。請說明你如何使用它(以及任何失敗的日誌消息)。你不需要'將宏變量導入數據步驟'。宏變量是文本,因爲它們的主要工作是解析爲SAS代碼。

18 %let n=3; 
19 data _null_; 
20  array r{&n}; 
21  do i=1 to dim(r); 
22  put i=; 
23  end; 
24 run; 

i=1 
i=2 
i=3 
+0

奇怪的是,我想我什麼都試過了,除了剛剛&N,採用各種過於複雜的呼叫等的使用&N做的工作就好了,對不起,浪費你的時間在那裏。 –

2

就像一個建議,你不需要這樣做。爲此存在PROC TRANSPOSE。那麼你甚至不需要知道有多少變量/行。

data forecast; 
    call streaminit(7); 
    do id = 1 to 243; 
    forecast = rand('Normal')*5; 
    output; 
    end; 
run; 

proc transpose data=forecast out=forecasts prefix=r; 
    by id; 
    id id; 
    var forecast; 
run; 

如果不真正想要243行,但只想要一個,轉儲byid語句。

即使您想在數據步驟中完成此操作,您可以通過將set放入裏面(現在您正在檢查241 * 241次,您只需要241次...)循環。在這裏,我使用自動丟棄的變量_n_來迭代循環。

data forecasts; 
    do _n_ = 1 by 1 until (eof); 
    set forecast end=eof; 
    array r(243); 
    r[_n_] = forecast; 
    output; *if you actually want one row per original row still; 
    call missing(r[_n_]); *clear it out; 
    end; 
    drop forecast; 
run; 
+0

note我在我的例子中使用了243,而不是241,所以請將它調整到正確的值。 – Joe

+0

非常酷,我的數據集實際上比241個變量大得多,所以我會弄清楚並實施它以節省時間。 –

+0

我還會注意到,根據你在做什麼,可能有更好的方法來做到這一點 - 例如,如果你正在創建一個對角矩陣,PROC IML是做這件事的地方,一些更高級的迴歸/等等。類型分析例程也可以爲你做到這一點。 – Joe

相關問題