我有一个如下所示的SAS数据集:
id | Date | ...
1 17 Jun
1 19 Jun
2 17 Jun
2 19 Jun
2 21 Jun
3 12 May
每个id代表一个独特的人。 我想为每个唯一的人保留一行,但是,仍然将日期保留在数据集中。 为实现这一目标,我需要将表格转换为以下格式:
id | Date1 | Date2 | Date 3
1 17 Jun 19 Jun
2 17 Jun 19 Jun 21 Jun
3 12 May
如果只为该人分配了1个日期,则将date2和date3保留为缺失值。
我正在使用的完整数据集包含超过180个不同日期的数千个观察结果。但是,一个独特的人最多会被分配到5个不同的日子。
任何帮助表示赞赏
答案 0 :(得分:3)
PROC SUMMARY具有使用IDGROUP语句执行此操作的功能。下面的代码将转置数据并按日期顺序(由min(date)指定)创建5个日期列(由out [5]指定)。如果您想了解有关其工作原理的更多信息,请查看PROC MEANS / SUMMARY文档中的IDGROUP语句。
data have;
input id Date :date9.;
format date date9.;
datalines;
1 17Jun2012
1 19Jun2012
2 17Jun2012
2 19Jun2012
2 21Jun2012
3 12May2012
;
run;
proc summary data=have nway;
class id;
output out=want (drop=_:)
idgroup(min(date) out[5] (date)=);
run;
答案 1 :(得分:0)
使用Proc Transpose,然后使用Data Step(并借用Keith的数据)。
两种方式都需要按ID排序的数据。
data have;
input id Date :date9.;
format date date9.;
datalines;
1 17Jun2012
1 19Jun2012
2 17Jun2012
2 19Jun2012
2 21Jun2012
3 12May2012
4 01JAN2013
4 02JAN2013
4 03JAN2013
4 04JAN2013
4 05JAN2013
;
run;
proc sort data=have;
by id;
run;
Proc transpose data=have out=transpose(drop=_name_) prefix=DATE;
by id;
run;
data ds(drop=cnt date);
retain date1 date2 date3 date4 date5;
format date1 date2 date3 date4 date5 mmddyy10.;
set have;
by id;
if first.id then cnt=1;
select(cnt);
when(1) date1=date;
when(2) date2=date;
when(3) date3=date;
when(4) date4=date;
when(5) date5=date;
otherwise;
end;
cnt+1;
if last.id then do;
output;
call missing(of date1-date5);
end;
run;