我想通过列名在PROC SQL(可能使用宏?)中拆分包含许多(454)列的表。
例如:一列以“Column21 .... T”,“Column22 .... T”等开头。
我想将所有以“Column21 ... T”开头的列写入名为First的数据集,将所有以“Column22 .... T”开头的列写入名为Second的数据集中,等。
我想保留转置表的第一列和第二列,因为它们包含描述行。
由于列数较多,我无法使用select column1,column2 .... Column454。
我该怎么做?
(@ Mod:感谢清理:))
编辑,一张图片说明一切:
This is my transposed table with 454 columns
PROC SORT
DATA=work.stat(KEEP=A_ B_ C_ D_ Vx G Vy)
OUT=work.stat2;
BY G;
RUN;
PROC TRANSPOSE DATA=work.stat2
OUT=WORK.x(LABEL="Transposed")
PREFIX=Column
LET
NAME=Source
LABEL=Label;
BY G;
ID Vx;
IDLABEL Vy;
VAR A_ B_ C_ D_;
RUN;
答案 0 :(得分:1)
您可以使用:
后缀制作变量列表。
data first ;
set have ;
keep id1 id2 column21: ;
run;
data second ;
set have ;
keep id1 id2 column22: ;
run;
更新了相关详情。
那么为什么不单独转换每个组呢?创建一个宏来转置Vx
的一个值。
%macro split(value);
PROC TRANSPOSE DATA=work.stat2
OUT=WORK.Column&value (LABEL="Transposed Vx=&value")
PREFIX=Column
LET
NAME=Source
LABEL=Label
;
BY G;
WHERE Vx=&value ;
ID Vx;
IDLABEL Vy;
VAR A_ B_ C_ D_;
RUN;
%mend split ;
然后为Vx的每个值调用一次。
proc sort data=work.stat2(keep=Vx) nodupkey out=Vx_list ;
by Vx ;
run;
data _null_;
set Vx_list;
call execute(cats('%nrstr(%split)(',Vx,')'));
run;
答案 1 :(得分:1)
宏程序:
%macro split(data,outdata);
%do i=21 %to 121;
data &outdata.&i;
set &data;
keep id1 id2 col&i:;
run;
%end;
%mend;