2011-07-07 8 views
3

私は初めてSASマクロを手に入れようとしています。私の基本的な質問は、私は約10000の変数を持つデータセットを持っています。私は個々の列を個別に取得し、新しい条件付き変数を作成し、結果を格納し、次の列に移動する必要があります。これらの列は順番に並べられません。 SASは、(どのように「_ N _」行を識別するに類似)のカラムを識別するために使用する構文は何ですか?変数/列を使ってSASマクロを実行する方法は?

ここに詳しい情報があります。 データは次のようになります。

私は、値xを超えているとどのように多くのx値を下回っているどのように多くのOBSカウントデータセット内のこれらの数字を記録し、V1の値を見てする必要があります
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 

、 v2、v3、... v10000に移動します。最後に、私は10000個の変数のそれぞれについて、値xの上のobsの数と値xの下のobsの数を示すデータセットを持っています。

私は標準的なSASコードで1つの変数のために書いたコードを書いていますが、これは動作しますが、私の意図はそのコードをマクロコードに変換することです。ある列から次の列に移動します。

ご迷惑をおかけしますが、ご了承ください。

ありがとうございました。

+0

[OK]を、より多くの勤勉な研究は、最初の配列を使用するように私をリードしてきました、次に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

@サマンサ:これは約4年遅れることに気がついていますが、私が間違っていなければ、このようなアプローチに賛成して「やり直し」は推奨されません。ちょうどFYI。 –

+0

@Alex:ありがとう!私は余分な情報に感謝します。 – 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

関連する問題