SAS: повторить последнее значение по ID - PullRequest
0 голосов
/ 04 мая 2020

У меня есть эта база данных:

data temp;
input ID date type ;
  datalines;
 1 10/11/2006   1      
 1 10/12/2006   2      
 1 15/01/2007   2      
 1 20/01/2007   3    
 2 10/08/2008   1        
 2 11/09/2008   1        
 2 17/10/2008   1        
 2 12/11/2008   2    
 2 10/12/2008   3       
 ;

Я хотел бы создать новый столбец, в котором я повторяю последнюю дату с идентификатором:

data temp;
input ID date type  last_date;
  datalines;
 1 10/11/2006   1        20/01/2007
 1 10/12/2006   2        20/01/2007
 1 15/01/2007   2        20/01/2007
 1 20/01/2007   3        20/01/2007
 2 10/08/2008   1        10/12/2008
 2 11/09/2008   1        10/12/2008
 2 17/10/2008   1        10/12/2008
 2 12/11/2008   2        10/12/2008
 2 10/12/2008   3        10/12/2008
 ;

Я пробовал этот код, но он не работает:

  data temp;
  set temp;
  IF last.ID then last_date= .;
  RETAIN last_date;
  if   missing(last_date) then last_date= date;
  run;

Заранее благодарю за помощь!

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Двумя другими способами являются:

  • Proc SQL присоединение к под-выбору или
  • Proc MEANS + DATA/MERGE

SQL

 proc sql;
   create table want as
   select have.*, id_group.max_date as last_date format=ddmmyy10.
   from
     have
   join 
     ( select id, max(date) as max_date
       from have
       group by id
     ) as id_group
   on
     have.id = id_group.id
   ; 

СРЕДСТВО

proc means noprint data=have;
  by id;
  var date;
  output out=maxdates(keep=id last_date) max(date)=last_date;
run;

data want;
  merge have maxdates;
  by id;
run;
1 голос
/ 04 мая 2020

Во-первых, переменные FIRST.ID и LAST.ID не создаются на шаге данных, если вы не включили идентификатор переменной в инструкцию BY.

Во-вторых, это прикрепление последней даты к каждому наблюдению. вам нужно обработать данные дважды. Ваш текущий код (если добавлен оператор BY) будет присваивать значение LAST_DATE только в последнем наблюдении группы по.

Один из способов сделать это - пересортировать данные по убыванию даты в каждом затем по группам вы можете использовать BY ID, FIRST.ID и RETAIN.

proc sort data=have;
   by id descending date;
run;
data want;
   set have;
   by id descending date;
   if first.id then last_date=date;
   retain last_date;
   format last_date ddmmyy10.;
run;

Вот способ использования исходного порядка сортировки с использованием так называемого двойного DOW l oop. Размещая операторы SET / BY внутри DO l oop, вы можете прочитать все наблюдения для группы за один проход шага данных. Затем вы добавляете второй DO l oop, чтобы повторно обработать эту группу BY и использовать информацию, вычисленную в первом l oop, и записывать наблюдения.

data want;
do until (last.id);
  set have;
  by id;
end;
last_date=date ;
format last_date ddmmyy10.;
do until (last.id);
  set have;
  by id; 
  output;
end;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...