2016-02-04 114 views
1

我想拼合文件为一个ID出现的任何变量内容合并到一个记录。考虑下面的例子...平展文件,同时保留重复内容

我:

ID Date Color Letter 
1012 01/23 Red X 
1012 10/17 Blu F 
1012 07/28 Red N 
1012 04/09 Ylw G 
1392 04/12 Ylw P 
1392 03/11 Blu A 
1001 03/11 Blu E 

我想:

ID Date1 Date2 Date3 Date4 Clr1 Clr2 Clr3 Clr4 Ltr1 Ltr2 Ltr3 Ltr4 
1012 01/23 10/17 07/28 04/09 Red Blu Red Ylw X F N G 
1392 04/12 03/11 .  .  Ylw Blu   P A    
1001 03/11 .  .  .  Blu     E     

什么是有效的方式来做到这一点?

回答

4

这种运作良好,如果你有每组(ID)100级或更低的OB。它可以同时触发字符和数字变量。如果你想保留原来的顺序编号,你可以添加PROC语句选项ORDER = DATA。

data tall; 
    input (ID Date Color Letter)($); 
    cards; 
1012 01/23 Red X 
1012 10/17 Blu F 
1012 07/28 Red N 
1012 04/09 Ylw G 
1392 04/12 Ylw P 
1392 03/11 Blu A 
1001 03/11 Blu E 
;;;; 
    run; 
proc sql noprint; 
    select max(obs) into :obs 
     from (select count(*) as obs from tall group by id); 
    quit; 
%put NOTE: &=obs; 
proc summary data=tall nway; 
    class id; 
    output out=wide(drop=_: id_:) idgroup(out[&obs](_all_)=); 
    run; 

enter image description here

1

我目前做到这一点通过转每一个变量(在宏当有以上几个),然后合并产生的数据集(即只包含ID和选择的转置变量)在一起。

换位:

%macro flattener(minids= , fix= , trnvar=); 
    proc transpose data=have out=&minids prefix=&fix; 
       by ID; 
       var &trnvar; 
    run; 
%mend flattener; 

%flattener(minids=datDS, fix=Date, trnvar=Date ); 
%flattener(minids=clrDS, fix=Clr , trnvar=Color); 
%flattener(minids=ltrDS, fix=Ltr , trnvar=Letter); 

合并结果:

data ostudentflat; 
    merge datDS (drop=_NAME_ _LABEL_) 
      clrDS (drop=_NAME_ _LABEL_) 
      ltrDS (drop=_NAME_ _LABEL_); 
     by ID; 
run; 

我觉得必须有这样做更容易和更快的方式,但它能够完成任务。

相关问题