2015-05-04 45 views
1

我需要爲datastep的每次迭代(每個n)聲明一個變量,但是當我運行代碼時,SAS將只輸出最後一個變量聲明,最大n使用_n_命名變量,爲每個迭代的datastep命名爲

這似乎很愚蠢的聲明每行的變量,但我需要實現這個結果,我正在處理一個由frec freq創建的數據集,並且我需要爲每個組(每行數據集) 。

結果將在宏中,所以它必須是完全靈活的。

proc freq data=&data noprint ; 
table &group/out=frgroup; 
run; 

data group1; 
set group (keep=&group count) end=eof; 
call symput('gr', _n_); 
*REQUESTED code will go here; 
run; 

我嘗試這些:

var&gr.=.; 
call missing(var&gr.); 

和其他很多說法,但沒有奏效。 總是相同的結果,ds僅包括var & gr其中& gr是最大值n

似乎PDV每次迭代都覆蓋新變量,但名稱不同。 請將結果包含在單個datastep中,或者至少讓代碼儘可能少花時間。

關於如何達到要求的結果的任何想法?

謝謝。

+0

,請不要因爲我需要爲每行3列,使用PROC轉right_&GR sep_&GR left_&GR,這將通過一些數據,然後消耗臭氧層物質的輸出供給。 – stat

+0

另外,我可以使用調用執行來解決這個問題,但如果可能的話,我正在尋找一個不需要那個時間的解決方案,一個簡單的變量聲明會很棒。 – stat

回答

3

宏變量不像你認爲的那樣工作。任何宏變量引用在編譯時都會被解析,所以call symput在所有引用被解析後都會改變宏變量的值。你得到的結果是& gr最大爲n的原因是因爲這是你上次運行代碼的結果。

如果你知道你能確定最大_n_,你可以把最大值爲宏變量和聲明一個數組,像這樣:

查找最大_n_和值分配給maxn

data _null_; 
    set have end=eof; 
    if eof then call symput('maxn',_n_); 
run; 

創建變量:

data want; 
    set have; 
    array var (&maxn); 
run; 
+0

非常感謝,這完全改變了我對宏觀編程的看法。宏變量僅在處理結束時解決。 但是,現在是不可能將數據集中使用的宏變量定義到同一個數據表中? – stat

+0

您可以使用'symget()'函數或'resolve()'函數在同一數據步驟中實際獲取宏變量的值,但這些函數的用處是有限的,因爲它們只在表達式中有效,真的可以像宏變量引用一樣使用。 – DWal

3

如果你不喜歡proc transpose(如果你需要3列,你可以ALWA ys爲每一列使用一次,然後將輸出結果放在一起)你可以用數組來完成你所要求的。

首先需要確定輸入數據集中的組(即行)的數量,然後定義一個維數等於該數的數組。

然後可以使用_n_作爲索引來調用數組的第i個元素。 在下面的代碼&gr.包含組數:

data group1; 
    set group; 
    array arr_counts(&gr.) var1-var&gr.; 
    arr_counts(_n_)= count; 
run; 

在SAS有幾個是方法來確定數據集中觀測的數量,我最喜歡的是以下內容:(不與視圖的工作)

data _null_; 
    if 0 then set group nobs=n; 
    call symputx('gr',n); 
run; 
+0

謝謝,這個幫助很大。使用函數nobs =似乎是一個很好的解決方案,但是現在有沒有辦法將'a'用作數組長度的參數?像數組變量[n] $ var:? – stat