我有以下数据集
data input;
input Row$ A B;
datalines;
1 1 2
2 1 2
3 1 1
4 1 1
5 2 3
6 2 3
7 2 3
8 2 2
9 2 2
10 2 1
;
run;
我的目标只是保留变量A的第一组数据的记录。例如,我只想要记录A = 1和B = 2(第1行和第2行)以及下一组A = 2的记录和B = 3等......
我尝试了以下代码
data input (rename= (count=rank_b));
set input;
count + 1;
by A descending B;
if first.B then count = 1;
run;
仅给出A(1到4)和B(1到6)中的观察数。我想要的是
A B rank_b rank_b_desired
1 2 1 1
1 2 2 1
1 1 1 2
1 1 2 2
2 3 1 1
2 3 2 1
2 2 1 2
2 2 2 2
2 1 1 3
这样我就可以消除rank_b_desired不等于1的所有障碍物。
答案 0 :(得分:3)
当遇到A的新值时,将标志设置为1,如果B更改,则将其设置为0。当从输入中读取新行时,retain
将保留标志的值。
data want;
set input;
by A descending B;
retain flag;
if first.B then flag = 0;
if first.A then flag = 1;
run;
答案 1 :(得分:0)
也可以通过proc sql
实现所需的结果,还有一个好处,即它不依赖于预先排序的数据。
proc sql;
create table want as
select *
from input
group by A
having B = max(B)
order by Row;
quit;
或者匹配user234821的输出:
proc sql;
create table want as
select
*,
ifn(B = max(B), 1, 0) as flag
from input
group by A
order by Row;
quit;