在保留重复内容的同时展平文件

时间:2016-02-04 22:17:24

标签: sas transpose flatten

我想压缩文件以将任何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                  

有效的方法是什么?

2 个答案:

答案 0 :(得分:4)

如果每组(id)有100个或更少的obs,这个效果很好。它可以同时翻转字符和数字变量。如果您想保留ID的原始订单,可以添加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 :(得分: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;

我觉得必须有一种更容易,更快捷的方法,但它可以完成工作。