根据列号删除列 - SAS

时间:2016-01-26 18:58:54

标签: sql sas relational-database

我有一个包含以下列的数据集:

ID, value, value1, value2

我想保留列IDvalue。我想根据数字位置放弃其余部分。因此value1value2相当于3和4.我想丢弃大于或等于3的任何内容。

SAS / SQL保留曲目中是否有任何语法允许我根据其位置引用和删除列。

DATA TEST;
   INPUT id $ value value1 value2;
   DATALINES;
a 10 1 8
a 13 2 11
a 14 3 23
b 15 4 44
b 44 5 45
c 64 6 67
c 32 6 47
d 12 7 895
;
RUN;

感谢。

2 个答案:

答案 0 :(得分:3)

一种方法是从sashelp.vcolumn读取列,然后将前4列保存到宏变量中。

proc sql inobs=4;
    select name
    into :keepcols separated by ','
    from TEST
    where libname = 'WORK'
          AND memname = 'TEST';

proc sql;
    select &keepcols
    from TEST;
quit;

如果由于某种原因无法使用字典表,可以使用proc transpose获取列:

proc transpose data=TEST(obs=0)
               out=cols;
run;

proc sql noprint inobs=4;
    select _NAME_
    into :keepcols separated by ','
    from cols;
quit;

proc sql;
    select &keepcols
    from TEST;
quit;

答案 1 :(得分:2)

Proc Contents通常比字典表更快地执行。

PROC CONTENTS DATA=sourcetable OUT=temptable NOPRINT ;
RUN ;

PROC SQL ;

  SELECT name
    INTO :selectclause SEPARATED BY ', '
    FROM temptable
    WHERE varnum LE 3
    ORDER BY npos
  ;

  CREATE TABLE shorttable AS
    SELECT &selectclause
      FROM sourcetable
  ;

QUIT ;