SAS 使用计数识别两个变量的组合

SAS identify combinations of two variables using count

我有以下数据集

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 的对象。

遇到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;

也可以通过 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;