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

If statement 在SAS中,如果满足特定条件,如何停止标记一组行?,if-statement,group-by,sas,dataset,logic,If Statement,Group By,Sas,Dataset,Logic,我在SAS数据集中有一个如下表: 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','04NOV2

我在SAS数据集中有一个如下表:

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;
+----+-----------+--------+---------+
| 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      | .       |
+----+-----------+--------+---------+
我正在尝试创建一个新列
所需的
,如果
my_col
中的值缺失或小于3,则该列将为每组
id
列用值1标记该行

我遇到的问题是,当
my_col
值大于2时,我需要该行的
所需的
值丢失,并且停止用值1标记
id
组中的任何剩余行

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

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;
+----+-----------+--------+---------+
| 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 $1.;
    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对数据进行排序

data my_table2;
    set my_table;
    by id;
    format gt2flag $1.;
    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;

看起来像是保留变量的简单应用程序。启动新组时将标志设置为1,然后在MY_COL的值大于2时将其设置为missing

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 :$1. 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
;

看起来像是保留变量的简单应用程序。启动新组时将标志设置为1,然后在MY_COL的值大于2时将其设置为missing

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 :$1. 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
;

随机排序日期变量的用途是什么?随机排序日期变量的用途是什么?