有条件地删除SAS中最近插入的观察

时间:2015-09-08 15:50:38

标签: sas sas-macro proc-sql

我有两张表A和B,如下所示。

表A

rowno flag1 flag2 flag3 1 1 0 0 2 0 1 1 3 0 0 0 4 0 1 1 5 0 0 1 6 0 0 0 7 0 0 0 8 0 1 0 9 0 0 0 10 1 0 0

表B

rowno flag1 flag2 flag3

表A和B具有相同的列名,但B最初是一个空表。

所以我想要完成的是使用宏逐行插入A到B的值,rowno迭代。每次我从A到B插入一行时,我想计算每个标志列的总和。

如果插入每一行后,总和(flag1)> 1或sum(flag2)> 1或sum(flag3)> 1,我需要删除表B中插入的行。然后迭代一直运行到表A中的观察结束。表B中的最终输出从表A得到5个观察结果。

我到目前为止的代码如下:

%macro iteration;

%do rowno=1 %to 10;

proc sql;

insert into table.B
select *
from table.A
where rowno = &rowno;

quit;

set table.B;

if
sum(flag1) > 1
or
sum(flag2) > 1
or
sum(flag3) > 1

then delete;

run;

%end;
%mend iteration;

%iteration

我收到了很多错误消息。

期待您的帮助和建议。感谢。

理想的输出数据看起来像这样

 rowno  flag1  flag2  flag3
    1    1      0      0
    2    0      1      1
    3    0      0      0
    6    0      0      0
    7    0      0      0

1 个答案:

答案 0 :(得分:0)

使用运行总和来计算每行的运行总和,而不是宏。如果需要删除一行,请记住将增量反转为运行总和。根据您的数据,我认为第9行也应该保留。

data TableA;
input rowno  flag1  flag2  flag3;
cards;
    1    1      0      0
    2    0      1      1
    3    0      0      0
    4    0      1      1
    5    0      0      1
    6    0      0      0
    7    0      0      0
    8    0      1      0
    9    0      0      0
   10    1      0      0
;
run;

data TableB;
set TableA;
retain sum_:;

*Increment running sum for flag;
sum_flag1+flag1;
sum_flag2+flag2;
sum_flag3+flag3;

*Check flag amounts;
if sum_flag1>1 or sum_flag2>1 or sum_flag3>1 then do;
    *if flag is tripped then delete increment to flag and remove record;
    sum_flag1 +-flag1;
    sum_flag2 +-flag2;
    sum_flag3 +-flag3;
    delete;
end;

run;
相关问题