在 SAS 中,如果满足特定条件,如何停止标记一组行?

In SAS, how do you stop flagging a group of rows if a specific condition is met?

我在 SAS 数据集中有一个 table,如下所示:

proc sql;
create table my_table
    (id char(1),
    my_date num format=date9.,
    my_col num);
insert into my_table
    values('A','01JAN2010'd,.)
    values('A','02JAN2010'd,0)
    values('A','03DEC2009'd,1)
    values('A','04NOV2009'd,1)
    values('B','01JAN2010'd,.)
    values('B','02NOV2009'd,2)
    values('C','01JAN2010'd,.)
    values('C','02OCT2009'd,3)
    values('D','01JAN2010'd,.)
    values('D','02NOV2009'd,2)
    values('D','03OCT2009'd,1)
    values('D','04AUG2009'd,2)
    values('D','05MAY2009'd,3)
    values('D','06APR2009'd,1);
quit;

我正在尝试创建一个新列 desired,对于每组 id 列,如果缺少 my_col 中的值,则用值 1 标记该行或少于 3.

我遇到问题的部分是,当 my_col 值大于 2 时,我需要缺少该行的 desired 值,并且 stop 用值 1 标记 id 组中的任何剩余行。

生成的数据集应如下所示:

+----+-----------+--------+---------+
| id | my_date   | my_col | desired |
+----+-----------+--------+---------+
| A  | 01JAN2010 | .      | 1       |
| A  | 02JAN2010 | 0      | 1       |
| A  | 03DEC2009 | 1      | 1       |
| A  | 04NOV2009 | 1      | 1       |
| B  | 01JAN2009 | .      | 1       |
| B  | 02NOV2009 | 2      | 1       |
| C  | 01JAN2010 | .      | 1       |
| C  | 02OCT2009 | 3      | .       |
| D  | 01JAN2010 | .      | 1       |
| D  | 02NOV2009 | 2      | 1       |
| D  | 03OCT2009 | 1      | 1       |
| D  | 04AUG2009 | 2      | 1       |
| D  | 05MAY2009 | 3      | .       |
| D  | 06APR2009 | 1      | .       |
+----+-----------+--------+---------+

我想不出更简单的方法,但这行得通。您需要按 ID 对数据进行排序。

data my_table2;
    set my_table;
    by id;
    format gt2flag .;
    retain gt2flag;
    
    if first.id then gt2flag='';
    
    if my_col gt 2 then gt2flag='Y';
    
    if gt2flag = 'Y' then desired=.;
    else desired=1;
    
    drop gt2flag;
run;
id  my_date my_col  desired
A   01JAN2010   .   1
A   02JAN2010   0   1
A   03DEC2009   1   1
A   04NOV2009   1   1
B   01JAN2010   .   1
B   02NOV2009   2   1
C   01JAN2010   .   1
C   02OCT2009   3   .
D   01JAN2010   .   1
D   02NOV2009   2   1
D   03OCT2009   1   1
D   04AUG2009   2   1
D   05MAY2009   3   .
D   06APR2009   1   .

看起来像是保留变量的简单应用。当你开始一个新组时将标志设置为1,然后当MY_COL的值大于2时将其设置为缺失。

data want;
  set my_table ;
  by id;
  if first.id then desired=1;
  if my_col>2 then desired=.;
  retain desired;
run;

也不清楚为什么您使用如此复杂的代码来创建您的示例数据。为什么不是简单的数据步骤?

data my_table;
  input id :. my_date :date. my_col;
  format my_date date9.;
cards;
A 01JAN2010 .
A 02JAN2010 0
A 03DEC2009 1
A 04NOV2009 1
B 01JAN2010 .
B 02NOV2009 2
C 01JAN2010 .
C 02OCT2009 3
D 01JAN2010 .
D 02NOV2009 2
D 03OCT2009 1
D 04AUG2009 2
D 05MAY2009 3
D 06APR2009 1
;