首页 > 代码库 > SAS实验室之PROC TRANSPOSE

SAS实验室之PROC TRANSPOSE

首先,抛开SAS,回忆我们在数学课本上学习的转置是什么概念,转置如下图:

技术分享

以上就是数学中的转置。

那么在SAS里该如何转置呢?

先看语法格式:

PROC TRANSPOSE <DATA=http://www.mamicode.com/input-data-set> <DELIMITER=delimiter> <LABEL=label> 
<LET> <NAME=name> <OUT=output-data-set> <PREFIX=prefix> <SUFFIX=suffix>; 
BY <DESCENDING> variable-1 
<<DESCENDING> variable-2 ...>
<NOTSORTED>; 

COPY variable(s); 

ID variable; 

IDLABEL variable; 

VAR variable(s); 

其中,VAR variable(s); 确定要转置的数据,后面跟数据对应的变量名;

ID variable;确定转置后新变量的变量名,若没有该语句,则新变量名以COLN的形式命名;
BY <DESCENDING> variable-1  <<DESCENDING> variable-2 ...> <NOTSORTED>; 确定以什么变量分组,最终各个组分别转置,后面跟要分组的变量名;
COPY variable(s); 对于没有转置但是要保留的变量给复制下来;
IDLABEL VARIABLE;/
<LABEL=label> 给被转置的变量加上标签;
<PREFIX=prefix>新形成的变量的变量名的前缀;
<SUFFIX=suffix>新形成的变量的变量名的后缀;
LET 允许转置中存在重复值。

先看代码如下:

DATA A1;
    INPUT ID X1 $ X2 $ X3 $;
    CARDS;
    1 a1 a2 a3
    2 a4 a5 a6
    3 a7 a8 a9
    ;
RUN;
PROC TRANSPOSE DATA=A1 OUT=B1;
    VAR X1 X2 X3;
RUN;
PROC PRINT;
RUN;

代码中先造了一个如上图的矩阵,在进行了转置,输出结果为下图:

技术分享

由结果可知,矩阵的主体就已经转置好了,其实SAS的PROC TRANSPOSE过程的核心是在于确定VAR语句,VAR跟着的变量名确定好了,整个转置的功能也完成的80%。

VAR跟着的变量就是原数据集中想转置的观测数据对应的变量名。

PROC TRANSPOSE DATA=http://www.mamicode.com/A1 OUT=B1;
    ID X1;
    VAR X1 X2 X3;
RUN;

加上ID语句之后的运行结果为:

技术分享

直接以X1列的观测作为新变量的观测了。而在实际应用中我们会以对应的项目名称变量,为新变量命名(如下面代码);

DATA A3;
    INPUT ID XYZ $ X1 $ X2 $ X3 $;
    CARDS;
    1 X a1 a2 a3
    1 Y a4 a5 a6
    1 Z a7 a8 a9
    2 X B1 B2 B3
    2 Y B4 B5 B6
    2 Z B7 B8 B9
    3 X C1 C2 C3
    3 Y C4 C5 C6
    3 Z C7 C8 C9
    ;
RUN;
PROC TRANSPOSE DATA=A3 OUT=B3(DROP=_NAME_);
    VAR X1 X2 X3;
    BY ID;
    ID XYZ;
RUN;
PROC PRINT;
RUN;

运行结果为:

技术分享

以上代码演示了BY语句的效果,以ID的数据分类分组,然后在转置。

下面我们还可以看看其他几个options的效果;

如代码:

PROC TRANSPOSE DATA=http://www.mamicode.com/A4 OUT=B1(DROP=_NAME_)LET LABEL=STUDENT 
NAME=TEACHER PREFIX=prefix SUFFIX=suffix;
    VAR X1 X2 X3;
    BY ID;
    ID XYZ;
RUN;

得到的结果如下:

 技术分享

有了附加的OPTIONS 的小功能,使数据集看上去更加具有可读性。

SAS实验室之PROC TRANSPOSE