0

以下のコードの実行中にエラーが発生します。&CNTであり50、その&vars中に列名があります。

1からまでの値としての各列100。各列を選択し、以下の基準 (%ifステートメント) をチェックして、新しい変数を作成し、それに値を割り当てたい ( free、 、partially freeなどnot free)。

option mlogic mprint;
%macro analysis();
DATA Q2;
SET Q1;
%do i=1 %to &CNT.;
%let segs =%scan(&VARS.,&i.," ");
%IF &SEGS.<=2.5 %THEN &SEGS._R="FREE";
%ELSE %IF (&SEGS.>2.5 AND &SEGS.<5.5) %THEN &SEGS._R="PARTLY FREE";
%ELSE %IF &SEGS.>=5.5 %THEN &SEGS._R="NOT FREE";
/*%PUT &segs.;*/
%end;
RUN;
%MEND;
%analysis();

これは私が得ている出力です:

SAS LOG ERROR:

MPRINT(ANALYSIS):   DATA Q2;
MPRINT(ANALYSIS):   SET Q1;
MLOGIC(ANALYSIS):  %DO loop beginning; index variable I; start value is 1;     stop value is 56; by value
  is 1.
MLOGIC(ANALYSIS):  %LET (variable name is SEGS)
MLOGIC(ANALYSIS):  %IF condition &SEGS.<=2.5 is FALSE
MLOGIC(ANALYSIS):  %IF condition (&SEGS.>2.5 AND &SEGS.<5.5) is FALSE
MLOGIC(ANALYSIS):  %IF condition &SEGS.>=5.5 is TRUE
MLOGIC(ANALYSIS):  %PUT &segs.
yr1960
MLOGIC(ANALYSIS):  %DO loop index variable I is now 2; loop will iterate again.
MLOGIC(ANALYSIS):  %LET (variable name is SEGS)
MLOGIC(ANALYSIS):  %IF condition &SEGS.<=2.5 is FALSE
MLOGIC(ANALYSIS):  %IF condition (&SEGS.>2.5 AND &SEGS.<5.5) is FALSE
MLOGIC(ANALYSIS):  %IF condition &SEGS.>=5.5 is TRUE
***NOTE: Line generated by the macro variable "SEGS".
1      yr1961_R
   --------
   22
4

1 に答える 1

1

マクロ プロセッサ内とデータ ステップ内の IF 条件を混同しています。これがあなたの望むものだと思います。

%macro analysis();
DATA Q2;
SET Q1;
%do i=1 %to &CNT.;
%let segs =%scan(&VARS.,&i.," ");
IF &SEGS.<=2.5 THEN &SEGS._R="FREE";
ELSE IF (&SEGS.>2.5 AND &SEGS.<5.5) THEN &SEGS._R="PARTLY FREE";
ELSE IF &SEGS.>=5.5 THEN &SEGS._R="NOT FREE";
/*%PUT &segs.;*/
%end;
RUN;
%MEND;
%analysis();

マクロはコードを記述します。数値を使用した変数値と定数値ではなく、変数 Name を定数値 (文字列の順序付けを使用) と比較していました。

于 2016-02-29T19:35:11.173 に答える