我有一个数据集,其中有关于一个人上过的课程的信息。我感兴趣的信息,他们开始的第一个课程(开始日期和结束日期),也开始和结束日期的最后一个课程开始。课程可以重叠,每个人都可以有大量的课程。我想编辑数据,使一个人是一个观察。
首先,我对数据进行了如下排序:
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中修改什么?
发布于 2015-02-04 14:21:52
实际上,我将为此使用PROC SUMMARY (与PROC MEANS和NOPRINT选项相同)。您可以利用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;https://stackoverflow.com/questions/28323009
复制相似问题