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

Conditionally delete the most recently inserted observation in SAS

我有两个 tableA 和 B,如下所示。

Table一个

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

Table乙

rowno flag1 flag2 flag3

Table A 和 B 具有相同的列名,但 B 最初是空的 table。

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

如果在插入每一行后,sum(flag1) > 1 或 sum(flag2) >1 或 sum(flag3) >1,我需要从 table B 中删除插入的行。然后迭代保持 运行 直到 Table A 中的观察结束。Table B 中的最终输出是从 table 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

不使用宏,而是使用 运行 总和来计算每行的 运行 总和。如果您需要删除一行,请记住将增量反转为 运行 总和。根据您的数据,我认为第 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;