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

时间:2015-01-28 11:36:21

标签: sas counter

我有以下数据集

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的所有障碍物。

2 个答案:

答案 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;