Как в SAS перестать отмечать группу строк, если выполняется определенное условие c? - PullRequest
1 голос
/ 11 июля 2020

У меня есть таблица в наборе данных 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;

Я пытаюсь создать новый столбец desired, который для каждой группы столбцов id помечает строку с значение 1, если значение в my_col отсутствует или меньше 3.

У меня проблема с тем, что когда есть значение my_col, которое больше 2, мне нужно значение desired для этой строки должно отсутствовать, а также stop помечать все оставшиеся строки в группе id значением 1.

Результирующий набор данных должен выглядеть следующим образом:

+----+-----------+--------+---------+
| 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      | .       |
+----+-----------+--------+---------+

Ответы [ 2 ]

4 голосов
/ 11 июля 2020

Похоже на простое применение сохраненной переменной. Установите флаг в 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 :$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 голос
/ 11 июля 2020

Я не могу придумать более простого способа сделать это, но это работает. Вам нужно будет отсортировать данные по идентификатору.

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  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   .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...