Подмножество данных sas по самой ранней дате для каждого предмета

Я пытаюсь получить подмножество набора данных SAS на основе самого раннего экземпляра события для каждой конкретной темы. Вот пример набора данных:

subject    date
001        12/22/2009
001        01/14/2016
001        03/20/2014
002        02/12/2007
002        01/23/2015

Мне просто нужно следующее:

subject    date
001        12/22/2009
002        02/12/2007
0
0
377
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Использование дополнительной обработки с first.:

/* sort into order */
proc sort data=have ;
  by subject date ;
run ;

/* Take 1st record per subject (i.e. earliest date) */
data want ;
  set have ;
  by subject ;
  if first.subject ;
run ;

с помощью proc sql вы можете, как показано ниже

 proc sql;
 create table want as
 select * from have
 group by subject
 having date=min(date);

или вы можете использовать средства proc

   proc means data=have  nway;
   class subject;
   var date;
  output out=want(keep =id date) min(date) =date;
  run;

Пример PROC MEANS из @Kiran был бы моим предпочтительным методом, слегка измененным для использования параметра IDGROUP в операторе OUTPUT. По сути, он работает так же, как «выбранное решение», но не требует сортировки. Я изменил переменную даты на символьный формат iso8601, чтобы показать, что IDGROUP также поддерживает символьные переменные.

data have;
   infile cards firstobs=2;
   input subject:$3. date:mmddyy.;
   dtc = put(date,yymmdd10.);
   random = ranuni(134);
   format date date9.;
   cards;
subject    date
001        03/20/2014
002        02/12/2007
001        01/14/2016
001        12/22/2009
002        01/23/2015
;;;;
   run;
proc print;
   run;
proc summary data=have nway;
   class subject;
   output out=want(drop=_type_) idgroup(min(dtc) obs out(date--random)=);
   run;
proc print;
   run;

Другие вопросы по теме