在保留重复内容的同时展平文件
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;
【讨论】:
以上是关于在保留重复内容的同时展平文件的主要内容,如果未能解决你的问题,请参考以下文章