Создать счет от базовой линии в SAS - PullRequest
2 голосов
/ 11 февраля 2020

Я хочу создать переменную 'enumeration', начиная с записи, имеющей базовый флаг. Перечисление начинается с 0 и далее, если в строке есть запись «Y» для BaseFlag для каждого субъекта и запись в «Параметре».

Вот данные:

Subject             Parameter              Visit                 BaseFlag
001                 Param1                 1                     
001                 Param1                 2                     Y
001                 Param1                 3                     
001                 Param1                 4                     
002                 Param1                 1                     Y
002                 Param1                 2                     
002                 Param1                 3                     
002                 Param2                 1                     Y
002                 Param2                 2                       

Я хотел бы иметь следующее:

Subject             Parameter              Visit                 BaseFlag          Count
001                 Param1                 1                     
001                 Param1                 2                     Y                 0
001                 Param1                 3                                       1
001                 Param1                 4                                       2
002                 Param1                 1                     Y                 0
002                 Param1                 2                                       1
002                 Param1                 3                                       2
002                 Param2                 1                     Y                 0
002                 Param2                 2                                       1

Попытка:

proc sort data = data;
   by subject visit param;
run;

data want;
   set have;
   by subject visit param;
   retain count;
   if baseflag = 'Y' then count = 0;
   if first.subject then count + 1;
run;

К сожалению это не работает.

1 Ответ

3 голосов
/ 11 февраля 2020

Tricky. Вы на правильном пути, но вам нужно проверить свои заявления BY. На самом деле, VISIT в этом случае подчиняется PARAM.

Вот пример.

data have;
    subject='001'; param='Param1'; Visit=1; BaseFlag=' '; output;
    subject='001'; param='Param1'; Visit=2; BaseFlag='Y'; output;
    subject='001'; param='Param1'; Visit=3; BaseFlag=' '; output;
    subject='001'; param='Param1'; Visit=4; BaseFlag=' '; output;
    subject='002'; param='Param1'; Visit=1; BaseFlag='Y'; output;
    subject='002'; param='Param1'; Visit=2; BaseFlag=' '; output;
    subject='002'; param='Param1'; Visit=3; BaseFlag=' '; output;
    subject='002'; param='Param2'; Visit=1; BaseFlag='Y'; output;
    subject='002'; param='Param2'; Visit=2; BaseFlag=' '; output;
run;    

proc sort data = have;
   by subject param visit;
run;

data want;
   set have;
   by subject param visit;
   retain count .;
   if first.param then count=.;
   if baseflag = 'Y' then count = 0;
   else if count ne . then count + 1;
run;

enter image description here

...