Присвойте серийный номер наблюдениям в SAS - PullRequest
0 голосов
/ 16 августа 2011

У меня есть набор данных с переменными в качестве идентификатора и диагноза. Я хочу назначить серийный номер для диагностики на основе идентификатора. Например: если ID 1 имеет 5 диагнозов, я хочу, чтобы серийные номера были (1, 2, 3, 4,5), а затем, если ID 2 имеет 3 диагноза, серийные номера были бы (1, 2,3) и т. Д. на.

Есть ли способ сделать это в SAS? Большое спасибо.

Привет. Большое спасибо за ответ. Я действительно хочу это так.

Obs    diagnosis     id    diagnosis_serial_number

 1     XX             1    1
 2     XX1            1    2
 3     XX2            1    3
 4     XX3            1    4
 5     XX4            1    5
 6     XX             2    1
 7     XX1            2    2
 8     XX2            2    3

Ответы [ 3 ]

2 голосов
/ 16 августа 2011

Мне немного неясно, что именно вы просите, но я думаю, что это может сработать.Он использует оператор сохранения и шаг приращения для создания переменной счетчика с именем serial и использует групповую обработку для сброса счетчика каждый раз, когда обнаруживается новая группа идентификаторов.

Обратите внимание, что ваш входной набор данных (называетсяinput_ds здесь) сначала необходимо отсортировать по идентификатору перед использованием этого кода.

data output_ds;
    retain serial;
    set input_ds;
    by ID;
    if first.ID then serial = 0;
    serial = serial + 1;
run;
1 голос
/ 17 августа 2011

Нупур, чтобы получить результат, который вы только что описали, попробуйте это:

proc sort data=temp;
   by id diagnosis;
run;

data temp;
   set temp;
   by id diagnosis;
   retain diagnosis_serial_number 0;
   if first.id then do;
      diagnosis_serial_number = 0;
   end;
   diagnosis_serial_number + 1;
run;
0 голосов
/ 16 августа 2011

Нупур, если вам нужен серийный номер для каждого диагноза, попробуйте следующее:

proc sort data=temp;
   by id diagnosis;
run;

data temp_serial_number;
   set temp;
   by id diagnosis;
   format diagnosis_serial_number $30.;
   retain diagnosis_serial_number count;
   if first.id then do;
      count = 0;
      diagnosis_serial_number = "(";
   end;
   count + 1;
   diagnosis_serial_number = trim(left(diagnosis_serial_number)) || trim(left(count));
   if last.id then do;
      diagnosis_serial_number = trim(left(diagnosis_serial_number)) || ")";
      output;
   end;
   else do;
      diagnosis_serial_number = trim(left(diagnosis_serial_number)) || ",";
   end;
   drop diagnosis count;
run;

data temp;
   merge temp(in=in_temp) temp_serial_number(in=in_serial_nbr);
   by id;
   if in_temp then output;
run;

proc print data=temp;
run;

Вывод будет выглядеть так:

Obs    diagnosis     id    diagnosis_serial_number

 1     XX             1    (1,2,3,4,5)
 2     XX1            1    (1,2,3,4,5)
 3     XX2            1    (1,2,3,4,5)
 4     XX3            1    (1,2,3,4,5)
 5     XX4            1    (1,2,3,4,5)
 6     XX             2    (1,2,3)
 7     XX1            2    (1,2,3)
 8     XX2            2    (1,2,3)
...