SAS - proc sql - 选择属于一起的列?

时间:2018-02-25 01:25:53

标签: sas multiple-columns proc-sql

我想通过列名在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;

2 个答案:

答案 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;