2011-07-07 82 views
3

我第一次嘗試我的手在SAS宏。我的基本問題是:我有一個包含大約10000個變量的數據集。我需要分別取每列,創建一個新的條件變量,存儲結果,然後移動到下一列。這些列不是按順序排列的。 SAS用於識別列的語法是什麼(類似於「_ N _」將識別一行)?如何使SAS宏運行通過變量/列?

以下是更多信息。 數據看起來是這樣的:

ID v1 v2 v3 ... v10000 
01 3.2 1.5 7.8 ... 4.2 
02 1.1 4.5 1.9 ... 10.7 
.. 
N 2.5 1.5 4.9 ... 7.3 

我需要看看V1的值,算多少OBS是x的值之上,有多少是x的值以下,在數據集記錄這些數字,然後轉到v2,v3,... v10000。最後,我有一個數據集,可以顯示每個10000個變量的值x以上的obs數量和值x以下的obs數量。

我已經寫了代碼,因爲我將它寫入一個變量在標準SAS代碼中,它的工作原理是,現在我的意圖是將該代碼轉換爲宏代碼,但我不知道如何構建一個循環會從一列移動到另一列。

任何幫助或引用你可以給予將不勝感激。

謝謝。

+0

好,更勤奮地研究使我第一次使用數組,然後proc手段。宏甚至沒有必要。 – Samantha

回答

3
%LET CUTOFF = 3.1415926 ; /* set this as your 'cutoff' value */ 

data counters ; 
    set mydata end=eof ; 

    array vi{*} v1-v10000 ; /* incoming values */ 
    array vc{*} c1-c10000 ; /* counters */ 

    retain vc . ; 

    do i = 1 to dim(vi) ; 
    if vi{i} >= &CUTOFF then vc{i} + 1 ; 
    end ; 

    if eof then output ; 

    keep c1-c10000 ; 
run ; 
+0

謝謝!真漂亮。我用「do over」並設置了一個二進制變量,然後我將它們合計。你的效率更高。 – Samantha

+0

@Samantha:我意識到這大概晚了4年,但如果我沒有弄錯,那麼'do over'會被棄用,而不喜歡這種方法。只是FYI。 –

+0

@亞歷克斯:謝謝!我欣賞額外的信息。 – Samantha

0

不會是最有效的方式,但這會讓您獲得10000個單獨的數據集。

%macro splitdata; 
%do i=1 %to 10000; 
data v_&i; 
    set v; 
    array vArray[10000] v1-v10000; 
    keep vArray[&i]; 
run; 
%end splitdata; 

%splitdata; 

從那裏,你可以使用相同類型的宏做循環對每個數據集V_1,V_2,...

+0

我的問題一定不是很清楚 - 我想要一個數據集,而不是很多。但你說得對,陣列就是答案。我只是不知道術語!現在我知道了。 :-)非常感謝答覆。 – Samantha