我尝试计算一个额外的w列到我的表,但我的宏不能正常工作。
我收到了错误
- %DO%WHILE循环中的条件,t1.r(& i)EQ t1.r(& i + 1),产生无效或缺失值。
醇>
如果有人帮助我,我会非常感激。
%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
答案 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;