我想压缩文件以将任何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
有效的方法是什么?
答案 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;
答案 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;
我觉得必须有一种更容易,更快捷的方法,但它可以完成工作。