按每个受试者的最早日期对 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

将 by-processing 与first.一起使用:

/* 按顺序排序 */过程排序数据=有; 按主题日期 ; 跑;/* 每个科目的第一条记录(即最早日期( */数据需要 ; 设置有 ; 按主题 ; 如果第一个主题 ; 跑;

通过 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;

@Kiran中的 PROC MEANS 示例将是我的首选方法,稍作修改以在 OUTPUT 语句上使用 IDGROUP 选项。 它的工作方式与"所选解决方案"基本相同,但不需要排序。 我将日期变量修改为 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;

最新更新