1

以下は、いくつかの C コードです。sasで同じことを行うにはどうすればよいですか?

 For(i=30, j=1; i<=41, j<=12; i++, j++)
    (
    closure(i,j) /*calling function with input parameters I and j */
    );

基本的に、2 つのカウンター I と J を持つループを使用して、次のマクロ呼び出しを実行したいと考えています。

%closure(30,201201);
%closure(31,201202);
%closure(32,201203);
%closure(33,201204);
%closure(34,201205);
%closure(35,201206);
%closure(36,201207);
%closure(37,201208);
%closure(38,201209);
%closure(39,201210);
%closure(40,201211);
%closure(41,201212);

ネストされたループを使用したくないことに注意してください。ヒントをいただければ幸いです。

4

2 に答える 2

2

SAS でこれを行う方法は、データの構造によって異なります。これを行うことが可能です:

%do i = 1 to 12;
  %closure(%eval(29+i),%eval(201200+i));
%end;

それは少し奇妙ですが、うまくいくはずです。

%closure マクロでも実行できます。i を渡し、マクロ内の他のパラメーターの値を決定します (常にこの関係がある場合)。常に何らかの関係があるが、2012 年と 18 年の部分が変動する場合は、いくつかのオプションがあります。

この手順の前に、2012 と 29 をマクロ変数として定義し、コード内でそれらを置き換えます。

%let year=2012;
%let startrec=29;
%do i = 1 to 12;
  %closure(%eval(&startrec.+&i.),%eval(&year.00+&i.));
%end;

j の値が常に 01 ~ 12 ではない場合は、日付関数を使用して j の値を決定します。

%closure(30,%sysfunc(intnx(month,'01JUN2011'd,&i.-1)))

(結果を YYYYMM 形式でフォーマットしたい場合もあれば、%closure に応じて、日付の結果を使用した方が良い場合もあります)

これらすべての用語をデータセットで定義し、データセットからマクロを呼び出します。

data to_call;
input i j;
datalines;
30 201201
31 201202
.... ; 
run;

proc sql;
 select cats('%closure(',i,',',j,')') into :calllist separated by ' ' from to_call;
quit;

&calllist.

これは、プロセスをデータ駆動型にする、より「SAS」らしい方法です。i および j パラメーターがデータ要素としてどこかに格納されている場合に最も一般的に使用されます (たとえば、制御テーブル内、または他のデータ ソースから派生したもの)。

于 2013-04-04T17:39:47.043 に答える
1

あなたが望むなら

  • %閉鎖(30,201201);
  • %閉鎖(31,201202);
  • %閉鎖(32,201203);
  • %閉鎖(33,201204);
  • %閉鎖(34,201205);
  • %閉鎖(35,201206);
  • %閉鎖(36,201207);
  • %閉鎖(37,201208);
  • %閉鎖(38,201209);
  • %閉鎖(39,201210);
  • %閉鎖(40,201211);
  • %閉鎖(41,201212);

その場合は、J の値を計算して、201200 aur 付近に持っていく方がよいでしょう。または、201201 で j ループを開始し、201212 で終了する必要があります。

For(i=30, j=201201; i<=41, j<=201212; i++, j++)

(

  closure(i,j) 

);

于 2013-04-04T13:42:48.590 に答える