2013-05-22 153 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;