0

我有一个看起来像这样的 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 个不同的日子。

任何帮助表示赞赏

4

2 回答 2

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;
于 2013-05-22T07:57:56.983 回答
0

使用 Proc Transpose,然后使用数据步骤(并借用 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;
于 2013-05-22T18:42:50.140 回答