2013-05-22 113 views
0

我有一个SAS数据集,看起来像这样:修改SAS数据集

id | Date | ... 

1 17 Jun 

1 19 Jun 

2 17 Jun 

2 19 Jun 

2 21 Jun 

3 12 May 

每个ID都代表一个独特的人。 我想为每个唯一的人只保留1行,但是仍然保留数据集中的日期。 要做到这一点,我需要将表格转换为格式,如:

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个不同的日子。

任何帮助表示赞赏

回答

3

PROC总结了功能做到这一点,使用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; 
+0

IDGROUP,PROC MEANS的第三大被低估特征:) – Joe

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;