0

运行以下代码时出现错误。&CNTis50并且其中&vars包含列名。

每列作为一些值从1100。我想选择每一列并检查以下标准(%if语句),创建一个新变量并为其分配值(如free,partially freenot 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();

宏为您编写代码。您将变量 N​​ame 与常量值进行比较(使用字符串排序,不少于),而不是变量值与使用数字的常量值。

于 2016-02-29T19:35:11.173 回答