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

Posted

技术标签:

【中文标题】在保留重复内容的同时展平文件【英文标题】:Flattening a file while preserving duplicate contents 【发布时间】:2016-05-14 18:10:02 【问题描述】:

我想拼合一个文件以将任何 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                  

什么是有效的方法?

【问题讨论】:

【参考方案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;

我觉得必须有一种更简单、更快捷的方法来做到这一点,但它可以完成工作。

【讨论】:

【参考方案2】:

如果每个组 (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;

【讨论】:

以上是关于在保留重复内容的同时展平文件的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中展平嵌套和重复的结构(标准 SQL)

递归展平列表[重复]

在Python中展平一个浅表[重复]

在 Google BigQuery 中展平多个重复字段

在javascript中展平数组[重复]

BigQuery:展平两个重复的列