SAS宏中的循环

时间:2015-09-08 11:11:10

标签: loops macros sas

我尝试计算一个额外的w列到我的表,但我的宏不能正常工作。

我收到了错误

  
      
  1. %DO%WHILE循环中的条件,t1.r(& i)EQ t1.r(& i + 1),产生无效或缺失值。
  2.   

如果有人帮助我,我会非常感激。

%macro abc();
    proc sql;
        CREATE TABLE work.temp AS SELECT
            %let i=1;
            %do %while (t1.r(&i) EQ t1.r(&i+1));
                %if t1.td(&i) EQ t1.rd(&i) 
                    %then t1.c(&i)*t1.r(&i)-*t1.t(&i) as w;
                    %else t1.c(&i)*t1.r(&i)-0.11314*t1.t(&i) as w;
                %let i =  %eval(&i + 1);
            %end;
        FROM WORK.table t1
    quit;
%mend abc;
%abc();

表:

    m  rd     r      c       tem    td    t
  1002  t   28,393  50%     Tem-01  t   6,000
  1002  t   28,393  50%     Tem-02  e   4,000
  1002  t   28,393  50%     Tem-03  u   8,000
  1002  t   28,393  50%     Tem-04  t   6,000
  1002  t   28,393  50%     Tem-05  e   15,000
  1002  t   28,393  50%     Tem-06  u   52,000
  1002  u   14,746  100%    Tem-01  t   6,000
  1002  u   14,746  100%    Tem-02  e   4,000
  1002  u   14,746  100%    Tem-03  u   8,000
  1002  u   14,746  100%    Tem-04  t   6,000
  1002  u   14,746  100%    Tem-05  e   15,000
  1002  u   14,746  100%    Tem-06  u   52,000
  1002  u   21,847  50%     Tem-01  t   6,000
  1002  u   21,847  50%     Tem-02  e   4,000
  1002  u   21,847  50%     Tem-03  u   8,000
  1002  u   21,847  50%     Tem-04  t   6,000
  1002  u   21,847  50%     Tem-05  e   15,000
  1002  u   21,847  50%     Tem-06  u   52,000
  1003  u   10,000  50%     Tem-01  u   8,000
  1004  t   10,000  20%     Tem-02  u   5,000
  1005  t   10,000  20%     Tem-03  t   8,000
  1006  u   1,000   50%     Tem-04  t   5,000

1 个答案:

答案 0 :(得分:0)

为什么不只是使用CASE语句来决定对每个观察执行哪个计算?以下是您的示例数据:

data have;
  input m rd $ r c tem $ td $ t ;
  informat r t comma7. c percent. ;
cards;
  1002  t   28,393  50%     Tem-01  t   6,000
  1002  t   28,393  50%     Tem-02  e   4,000
  1002  t   28,393  50%     Tem-03  u   8,000
  1002  t   28,393  50%     Tem-04  t   6,000
  1002  t   28,393  50%     Tem-05  e   15,000
  1002  t   28,393  50%     Tem-06  u   52,000
  1002  u   14,746  100%    Tem-01  t   6,000
  1002  u   14,746  100%    Tem-02  e   4,000
  1002  u   14,746  100%    Tem-03  u   8,000
  1002  u   14,746  100%    Tem-04  t   6,000
  1002  u   14,746  100%    Tem-05  e   15,000
  1002  u   14,746  100%    Tem-06  u   52,000
  1002  u   21,847  50%     Tem-01  t   6,000
  1002  u   21,847  50%     Tem-02  e   4,000
  1002  u   21,847  50%     Tem-03  u   8,000
  1002  u   21,847  50%     Tem-04  t   6,000
  1002  u   21,847  50%     Tem-05  e   15,000
  1002  u   21,847  50%     Tem-06  u   52,000
  1003  u   10,000  50%     Tem-01  u   8,000
  1004  t   10,000  20%     Tem-02  u   5,000
  1005  t   10,000  20%     Tem-03  t   8,000
  1006  u   1,000   50%     Tem-04  t   5,000
;;;;

这是计算W的代码。

proc sql noprint ;
 create table want as
   select *
        , case when td=rd then c*r-t
               else c*r-0.11314*t
          end as w
   from have
 ;
quit;