3

初めて SAS マクロを試しています。私の基本的な質問は、約 10000 個の変数を持つデータセットがあります。各列を個別に取得し、新しい条件変数を作成し、結果を保存してから、次の列に移動する必要があります。これらの列は順番通りではありません。SAS が列を識別するために使用する構文は何ですか? (" _ N _ " が行を識別する方法と同様)?

詳細はこちら。データは次のようになります。

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 の値を見て、値 x より上にあるオブスの数と値 x より下にあるオブスの数を数え、それらの数をデータセットに記録してから、v2、v3、... v10000 に移動する必要があります。最後に、10000 個の変数のそれぞれについて、値 x を超える obs の数と値 x を下回る obs の数を示すデータセットを作成します。

標準の SAS コードで 1 つの変数に対して記述した場合と同じようにコードを記述しましたが、動作します。現在、そのコードをマクロ コードに変換することを意図していますが、1 つの変数から移動するループを構築する方法がわかりません。列を次に移動します。

あなたが与えることができる助けや参考文献は大歓迎です。

ありがとう。

4

2 に答える 2

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 ;
于 2011-07-11T15:27:40.700 に答える
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、... で同じ種類のマクロ do ループを使用できます。

于 2011-07-08T03:21:16.673 に答える