修改SAS数据集

时间:2013-05-22 02:13:47

标签: sas

我有一个如下所示的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个不同的日子。

任何帮助表示赞赏

2 个答案:

答案 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;