0

SAS IML を使用せずに SAS Base でそのような状況を処理できるかどうかを知りたいと思っています。

ベクトルが持っているとしましょう

            a    b     c     d    e        f
           1001 JPN 10,000  50%  JPN    2,000
           1001 EUR 12,648  100% EUR    3,000
           1001 USD 15,997  50%  USD    5,000
           1001 JPN 20,233  20%  JPN    8,000
           1001 EUR 25,591  20%  EUR    9,000
           1001 USD 32,368  50%  USD    4,000
           1002 JPN 28,393  50%  JPN    6,000
           1002 EUR 24,906  100% EUR    4,000
           1002 USD 21,847  50%  USD    8,000
           1002 TRY 19,164  20%  JPN    6,000
           1002 EUR 16,811  50%  EUR    15,000
           1002 USD 14,746  100% USD    52,000
           1003 USD 10,000  50%  XVN    8,000



 %macro;
 % let i = 1;
 data want;
 set have;
 %do %while a[&i]=a[eval(&i+1)] ;
 b = &i;
 &i=eval(&i+1);
 %end
 %mend

私がやりたいのは、b=e の a が max(c) と max(f) の差を取り、この差を d で乗算し、それぞれの a に対してこれらの結果を合計することです。これは反復されます。ここで作成した表は、ケースのほんの一部です。

ありがとう

4

3 に答える 3

1

この「for a with b=e」というフレーズの意味は、BY A レコード WHERE B=E を処理したいということです。
したがって、SAS で使用するレコードをフィルター処理する場合は、WHERE ステートメントまたはオプション、または IF ステートメントを使用します。一連の変数の同じ値を持つレコードのグループを処理するには、BY ステートメント (または PROC SQL コードの GROUP BY) を使用します。これがサンプルデータセットです。

data have ;
  length a 8 b $3 c d 8 e $3 f 8;
  informat c f comma32. d percent. ;
  input a b c d e f ;
cards;
1001 JPN 10,000  50%  JPN    2,000
1001 EUR 12,648  100% EUR    3,000
1001 USD 15,997  50%  USD    5,000
1001 JPN 20,233  20%  JPN    8,000
1001 EUR 25,591  20%  EUR    9,000
1001 USD 32,368  50%  USD    4,000
1002 JPN 28,393  50%  JPN    6,000
1002 EUR 24,906  100% EUR    4,000
1002 USD 21,847  50%  USD    8,000
1002 TRY 19,164  20%  JPN    6,000
1002 EUR 16,811  50%  EUR    15,000
1002 USD 14,746  100% USD    52,000
1003 USD 10,000  50%  XVN    8,000
run;

最初に、PROC SUMMARY を使用して C 変数と F 変数の最大値を見つけることができます。

proc summary data=have nway ;
  by a ;
  where b=e ;
  var c f ;
  output out=summary max= / autoname ;
run;

次に、詳細レコードとマージして差を計算し、パーセンテージを掛けることができます。

data middle ;
  merge have summary ;
  by a ;
  if b=e ;
  diff = c_max - f_max ;
  product = diff * d ;
run;

次に、PROC SUMMARY を再度使用して、各グループ内の合計を見つけることができます。

proc summary data=middle nway ;
  by a ;
  var product ;
  output out=want sum=new_var ;
run;

合計

Obs      a     _TYPE_    _FREQ_     new_var
1     1001       0         6       67767.2
2     1002       0         5      -82624.5
于 2015-09-18T13:00:59.227 に答える
0

したがって、基本的なデータ ステップまたは proc 呼び出しは、すでに入力データのループです。マクロ呼び出しのパラメーター値のソースとしてデータセットを使用する場合は、単純なドライバー プログラムが必要です。

複雑な一連のデータ ステップとプロシージャ ステップを実行し、1 つ以上の入力パラメーターを受け取るマクロを既に定義しているとします。次に、パラメーター値のデータセットを作成し、単純なデータ ステップで CALL EXECUTE を使用して、パラメーター値を渡すマクロへの呼び出しを生成できます。したがって、マクロ %MYMACRO() が 5 つの位置パラメータで定義され、PARM1 から PARM5 までの 5 つの変数と 10 個の観測値を持つデータ セット HAVE がある場合、このデータ ステップは 10 個のマクロ呼び出しを生成します。

 data _null_;
    set have;
    call execute(cats('%nrstr(%mymacro)(',catx(',',of parm1-parm5),')'));
 run;
于 2015-09-18T11:35:37.437 に答える