我有一个数据集,其中有关于一个人所学所有课程的信息。我对他们开始的第一门课程的信息感兴趣(开始日期和结束日期),以及他们开始的最后一门课程的开始和结束日期。课程可能重叠,每个人可能有大量的课程。我想编辑数据,这样一个人就是一个观察。
首先,我对数据进行了如下排序:
by personid startdate descending enddate;
我试过这个:
proc sql;
create table new as
select distinct personid,
count(*) as number_courses,
min(startdate) as first_startdate 'First startdate' format date9., min (enddate) as first_enddate 'First enddate' format date9.,
max(startdate) as last_startdate 'Last startdate' format date9., max(enddate) as last_enddate 'Last enddate' format date9.
from old
group by personid
;
quit;
但这并没有给我想要的。通常是min(结束日期)是错误的。我想要与起始日期的最小值相对应的结束日期,但它不一定是最小结束日期。
取而代之的是,我写道:
data first last;
set old;
by personid startdate descending enddate;
if first.personid then output first;
if last.personid then output last;
keep personid startdate enddate ;
run;
这给了我想要的东西。然后,我不得不重命名变量,并通过personid最后一次加入数据集。但我觉得这种方法不是最优的。
所以我的问题是,我应该在proc-sql中更改什么才能得到我想要的结果?
我实际上会使用PROC SUMMARY
(与带有NOPRINT
选项的PROC MEANS
相同)。您可以利用MINID
和MAXID
函数来满足您的需要。在代码中,MINID
说"给我起始日期和与最早起始日期相关的结束日期",MAXID
显然给出了与最新起始日期相关的值
data have; /* sample data */
input personid startdate :date9. enddate :date9.;
format startdate enddate date9.;
datalines;
1 01jan2014 01mar2014
1 25feb2014 01jun2014
1 03mar2014 25may2014
2 01may2014 01sep2014
2 02sep2014 01oct2014
2 01nov2014 01dec2014
;
run;
proc summary data=have nway;
class personid;
output out=want (drop=_:)
n(personid) = number_courses
minid(startdate(startdate enddate))=first_startdate first_enddate
maxid(startdate(startdate enddate))=last_startdate last_enddate;
run;