有条件地删除 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;
我有两个 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;